LFI2RCE via Eternal waiting

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[a-zA-Z0-9]{6}**와 같은 μ΄λ¦„μ˜ μž„μ‹œ 파일이 /tmp에 μƒμ„±λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 일뢀 도컀 μ΄λ―Έμ§€μ—μ„œλŠ” μƒμ„±λœ νŒŒμΌμ— μˆ«μžκ°€ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” κ²½μš°λ„ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

둜컬 파일 ν¬ν•¨μ—μ„œ μ—…λ‘œλ“œλœ νŒŒμΌμ„ 포함할 수 μžˆλ‹€λ©΄ RCEλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

기본적으둜 PHPλŠ” 단일 μš”μ²­μ—μ„œ 20개의 파일만 μ—…λ‘œλ“œν•  수 μžˆλ„λ‘ ν—ˆμš©ν•©λ‹ˆλ‹€ (섀정은 /etc/php/<version>/apache2/php.ini에 μžˆμŠ΅λ‹ˆλ‹€):

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

λ˜ν•œ, 잠재적인 파일 μ΄λ¦„μ˜ μˆ˜λŠ” 62*62*62*62*62*62 = 56800235584μž…λ‹ˆλ‹€.

λ‹€λ₯Έ κΈ°μˆ λ“€

λ‹€λ₯Έ κΈ°μˆ λ“€μ€ PHP ν”„λ‘œν† μ½œμ„ κ³΅κ²©ν•˜λŠ” 데 μ˜μ‘΄ν•©λ‹ˆλ‹€(경둜의 λ§ˆμ§€λ§‰ λΆ€λΆ„λ§Œ μ œμ–΄ν•  수 μžˆλ‹€λ©΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€), 파일의 경둜λ₯Ό λ…ΈμΆœμ‹œν‚€κ±°λ‚˜, μ˜ˆμƒλ˜λŠ” νŒŒμΌμ„ μ•…μš©ν•˜κ±°λ‚˜, PHPκ°€ μ„Έκ·Έλ©˜ν…Œμ΄μ…˜ 였λ₯˜λ₯Ό κ²ͺ게 ν•˜μ—¬ μ—…λ‘œλ“œλœ μž„μ‹œ 파일이 μ‚­μ œλ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 κΈ°μˆ μ€ λ§ˆμ§€λ§‰ 기술과 맀우 μœ μ‚¬ν•˜μ§€λ§Œ 제둜 데이λ₯Ό 찾을 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ˜μ›ν•œ λŒ€κΈ° 기술

이 κΈ°μˆ μ—μ„œλŠ” μƒλŒ€ 경둜만 μ œμ–΄ν•˜λ©΄ λ©λ‹ˆλ‹€. νŒŒμΌμ„ μ—…λ‘œλ“œν•˜κ³  LFIκ°€ λλ‚˜μ§€ μ•Šλ„λ‘ λ§Œλ“€ 수 μžˆλ‹€λ©΄, μš°λ¦¬λŠ” β€œμΆ©λΆ„ν•œ μ‹œκ°„β€œμ„ κ°€μ§€κ²Œ λ˜μ–΄ μ—…λ‘œλ“œλœ νŒŒμΌμ„ 브루트 ν¬μŠ€ν•˜κ³  찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

이 기술의 μž₯점:

  • ν¬ν•¨λœ 파일 λ‚΄μ—μ„œ μƒλŒ€ 경둜만 μ œμ–΄ν•˜λ©΄ λ©λ‹ˆλ‹€.
  • nginxλ‚˜ 둜그 νŒŒμΌμ— λŒ€ν•œ μ˜ˆμƒμΉ˜ λͺ»ν•œ μ ‘κ·Ό μˆ˜μ€€μ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ„Έκ·Έλ©˜ν…Œμ΄μ…˜ 였λ₯˜λ₯Ό μΌμœΌν‚€κΈ° μœ„ν•΄ 0일이 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 경둜 λ…ΈμΆœμ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 기술의 μ£Όμš” λ¬Έμ œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • νŠΉμ • 파일이 μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€(더 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€).
  • 미친 μ–‘μ˜ 잠재적 파일 이름: 56800235584
  • μ„œλ²„κ°€ 숫자λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 총 잠재적 양은: 19770609664
  • 기본적으둜 단일 μš”μ²­μ—μ„œ 20개 파일만 μ—…λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‚¬μš© 쀑인 μ„œλ²„μ˜ μ΅œλŒ€ 병렬 μž‘μ—…μž 수.
  • μ΄μ „μ˜ μ œν•œκ³Ό ν•¨κ»˜ 이 μ œν•œμ€ 이 곡격이 λ„ˆλ¬΄ 였래 μ§€μ†λ˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • PHP μš”μ²­μ˜ νƒ€μž„μ•„μ›ƒ. μ΄μƒμ μœΌλ‘œλŠ” 이 μš”μ²­μ΄ μ˜μ›ν•΄μ•Ό ν•˜κ±°λ‚˜ μž„μ‹œλ‘œ μ—…λ‘œλ“œλœ νŒŒμΌμ„ μ‚­μ œν•˜μ§€ μ•Šκ³  PHP ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•΄μ•Ό ν•©λ‹ˆλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 이것도 λ¬Έμ œκ°€ 될 κ²ƒμž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄, μ–΄λ–»κ²Œ PHP 포함을 λλ‚˜μ§€ μ•Šκ²Œ λ§Œλ“€ 수 μžˆμ„κΉŒμš”? 파일 **/sys/kernel/security/apparmor/revision**을 ν¬ν•¨μ‹œν‚€κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€ (μ•ˆνƒ€κΉκ²Œλ„ Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€β€¦).

κ·Έλƒ₯ ν˜ΈμΆœν•΄ λ³΄μ„Έμš”:

php -a # open php cli
include("/sys/kernel/security/apparmor/revision");

Apache2

기본적으둜 ApacheλŠ” 150개의 λ™μ‹œ 연결을 μ§€μ›ν•˜λ©°, https://ubiq.co/tech-blog/increase-max-connections-apache/에 λ”°λ₯΄λ©΄ 이 숫자λ₯Ό μ΅œλŒ€ 8000κΉŒμ§€ 늘릴 수 μžˆμŠ΅λ‹ˆλ‹€. 이 λͺ¨λ“ˆκ³Ό ν•¨κ»˜ PHPλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒμ„ λ”°λ₯΄μ„Έμš”: https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04.

기본적으둜 (λ‚΄ ν…ŒμŠ€νŠΈμ—μ„œ λ³Ό 수 μžˆλ“―μ΄) PHP ν”„λ‘œμ„ΈμŠ€λŠ” μ˜μ›νžˆ 지속될 수 μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜ν•™μ„ ν•΄λ΄…μ‹œλ‹€:

  • 149개의 연결을 μ‚¬μš©ν•˜μ—¬ 149 * 20 = 2980개의 μž„μ‹œ νŒŒμΌμ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 그런 λ‹€μŒ, λ§ˆμ§€λ§‰ 연결을 μ‚¬μš©ν•˜μ—¬ 브루트 포슀λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • 10 μš”μ²­/초의 μ†λ„λ‘œ μ‹œκ°„μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:
  • 56800235584 / 2980 / 10 / 3600 ~= 530μ‹œκ°„ (265μ‹œκ°„μ— 50% ν™•λ₯ )
  • (숫자 없이) 19770609664 / 2980 / 10 / 3600 ~= 185μ‹œκ°„ (93μ‹œκ°„μ— 50% ν™•λ₯ )

Warning

이전 μ˜ˆμ œμ—μ„œ μš°λ¦¬λŠ” λ‹€λ₯Έ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ™„μ „νžˆ DoSν•˜κ³  μžˆλ‹€λŠ” 점에 μœ μ˜ν•˜μ„Έμš”!

Apache μ„œλ²„κ°€ κ°œμ„ λ˜κ³  4000개의 연결을 λ‚¨μš©ν•  수 μžˆλ‹€λ©΄ (μ΅œλŒ€ 숫자의 절반). μš°λ¦¬λŠ” 3999*20 = 79980 νŒŒμΌμ„ 생성할 수 있으며, μ‹œκ°„μ€ μ•½ 19.7μ‹œκ°„ λ˜λŠ” 6.9μ‹œκ°„μœΌλ‘œ 쀄어듀 κ²ƒμž…λ‹ˆλ‹€ (10μ‹œκ°„, 3.5μ‹œκ°„ 50% ν™•λ₯ ).

PHP-FMP

정상적인 php λͺ¨λ“ˆ λŒ€μ‹  μ›Ή νŽ˜μ΄μ§€κ°€ PHP-FMPλ₯Ό μ‚¬μš©ν•˜μ—¬ PHP 슀크립트λ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 (이것은 μ›Ή νŽ˜μ΄μ§€μ˜ νš¨μœ¨μ„±μ„ ν–₯μƒμ‹œν‚€λ―€λ‘œ 일반적으둜 λ°œκ²¬λ©λ‹ˆλ‹€), κΈ°μˆ μ„ κ°œμ„ ν•˜κΈ° μœ„ν•΄ ν•  수 μžˆλŠ” λ‹€λ₯Έ 방법이 μžˆμŠ΅λ‹ˆλ‹€.

PHP-FMPλŠ” **/etc/php/<php-version>/fpm/pool.d/www.conf**μ—μ„œ request_terminate_timeout λ§€κ°œλ³€μˆ˜λ₯Ό ꡬ성할 수 있게 ν•΄μ€λ‹ˆλ‹€.
이 λ§€κ°œλ³€μˆ˜λŠ” PHP에 λŒ€ν•œ μš”μ²­μ΄ μ’…λ£Œλ˜μ–΄μ•Ό ν•˜λŠ” μ΅œλŒ€ 초 수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€ (기본적으둜 λ¬΄ν•œν•˜μ§€λ§Œ, λ§€κ°œλ³€μˆ˜κ°€ 주석 ν•΄μ œλ˜λ©΄ 30초). PHPκ°€ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ μ§€μ •λœ 초 μˆ˜κ°€ μ§€λ‚˜λ©΄, μš”μ²­μ΄ μ’…λ£Œλ©λ‹ˆλ‹€. μ΄λŠ” μš”μ²­μ΄ μž„μ‹œ νŒŒμΌμ„ μ—…λ‘œλ“œν•˜κ³  μžˆμ—ˆλ˜ 경우, PHP μ²˜λ¦¬κ°€ μ€‘λ‹¨λ˜μ—ˆκΈ° λ•Œλ¬Έμ—, ν•΄λ‹Ή 파일이 μ‚­μ œλ˜μ§€ μ•Šμ„ 것을 μ˜λ―Έν•©λ‹ˆλ‹€. λ”°λΌμ„œ μš”μ²­μ΄ κ·Έ μ‹œκ°„μ„ 지속할 수 μžˆλ‹€λ©΄, μ‚­μ œλ˜μ§€ μ•ŠλŠ” 수천 개의 μž„μ‹œ νŒŒμΌμ„ 생성할 수 있으며, μ΄λŠ” νŒŒμΌμ„ μ°ΎλŠ” 과정을 κ°€μ†ν™”ν•˜κ³  λͺ¨λ“  연결을 μ†Œλͺ¨ν•˜μ—¬ ν”Œλž«νΌμ— λŒ€ν•œ DoS ν™•λ₯ μ„ μ€„μž…λ‹ˆλ‹€.

λ”°λΌμ„œ DoSλ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ κ³΅κ²©μžκ°€ λ™μ‹œμ— 100개의 μ—°κ²°λ§Œ μ‚¬μš©ν•  것이라고 κ°€μ •ν•˜κ³ , php-fmp의 μ΅œλŒ€ 처리 μ‹œκ°„μΈ **request_terminate_timeout**이 30초라고 κ°€μ •ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ΄ˆλ‹Ή 생성할 수 μžˆλŠ” μž„μ‹œ 파일의 μˆ˜λŠ” 100*20/30 = 66.67μž…λ‹ˆλ‹€.

그런 λ‹€μŒ, 10000개의 νŒŒμΌμ„ μƒμ„±ν•˜κΈ° μœ„ν•΄ κ³΅κ²©μžλŠ”: **10000/66.67 = 150초**κ°€ ν•„μš”ν•©λ‹ˆλ‹€ ( 100000개의 νŒŒμΌμ„ μƒμ„±ν•˜λŠ” λ°λŠ” 25뢄이 μ†Œμš”λ©λ‹ˆλ‹€).

그런 λ‹€μŒ, κ³΅κ²©μžλŠ” 이 100개의 연결을 μ‚¬μš©ν•˜μ—¬ 브루트 포슀 검색을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 300 req/s의 속도λ₯Ό κ°€μ •ν•  λ•Œ, 이λ₯Ό ν™œμš©ν•˜λŠ” 데 ν•„μš”ν•œ μ‹œκ°„μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • 56800235584 / 10000 / 300 / 3600 ~= 5.25μ‹œκ°„ (2.63μ‹œκ°„μ— 50% ν™•λ₯ )
  • (100000개의 파일둜) 56800235584 / 100000 / 300 / 3600 ~= 0.525μ‹œκ°„ (0.263μ‹œκ°„μ— 50% ν™•λ₯ )

예, EC2 쀑간 크기 μΈμŠ€ν„΄μŠ€μ—μ„œ 100000개의 μž„μ‹œ νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 것이 κ°€λŠ₯ν•©λ‹ˆλ‹€:

Warning

νƒ€μž„μ•„μ›ƒμ„ νŠΈλ¦¬κ±°ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ·¨μ•½ν•œ LFI νŽ˜μ΄μ§€λ₯Ό ν¬ν•¨ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μΆ©λΆ„ν•˜λ―€λ‘œ, μ˜μ›ν•œ 포함 루프에 λ“€μ–΄κ°‘λ‹ˆλ‹€.

Nginx

기본적으둜 NginxλŠ” λ™μ‹œμ— 512개의 병렬 연결을 μ§€μ›ν•˜λŠ” κ²ƒμœΌλ‘œ 보이며 (이 μˆ«μžλŠ” κ°œμ„ λ  수 μžˆμŠ΅λ‹ˆλ‹€).

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 μ§€μ›ν•˜κΈ°