개요
웹 취약점 진단을 수행하다보면 WAS 서버인 Apache-Tomcat을 사용하는 대상을 자주 만날 수 있다. 그리고 이러한 Tomcat 서버는 호스트 관리를 위해 별도의 포트를 지정해 운영되는데 이때, 만약 진단 시 Tomcat 기본 페이지 접근이 가능하고 관리 페이지(manager/index.jsp, host-manager/index.jsp) 접근이 허용될 때 Tomcat 크리덴셜 탈취용으로 유용한 도구를 소개하고자 한다.
다운로드
도구(Python 스크립트)는 아래의 링크에서 다운로드 가능하다.
설명
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
Apache-Tomcat에 대한 어느정도 지식이 있다면 Tomcat 관리 계정 생성은 위 코드처럼 tomcat-users.xml 파일에서 할 수 있다는 것을 알고 있을 것이다. 다만, 요새 추세는 tomcat-users.xml 파일을 사용해 관리 계정을 생성하는게 아닌 별도의 파일을 Include해 사용하기 때문에 tomcat-users.xml 파일을 얻어도 계정 태그가 주석 처리가 되어 있다면 tomcat 관리 페이지 접근이 어렵다.
때문에, 이러한 상황에서는 관리 계정과 패스워드를 추측해서 로그인을 시도해야 하는데 ID : admin, PW : admin 이런게 아닌 이상은 별도의 스크립트를 작성하거나 도구를 사용해 무작위 대입 공격을 시도해야 한다.
[그림 1]의 코드는 Tomcat-Manager-Bruteforce 코드 중 일부로 사용자에게 계정명 및 패스워드 사전 파일을 인자로 받아 Tomcat 관리 페이지 무작위 로그인을 시도한다. 그러나 사용하다보니 상황에 따라서, 응답 시간 초과, SSLError 관련 오류가 발생하기도 해서 [그림 1]의 박스와 같이 별도의 예외 처리를 추가했다.
ex)
test:test -> Base64 인코딩 -> dGVzdDp0ZXN0
그리고 재밌는건 Tomcat 관리 페이지 로그인 시도 시 요청 패킷을 잡아보면 계정과 패스워드를 별도의 파라미터에 삽입해 전송하는 방식이 아닌 HTTP 요청 헤더인 Authorization에 계정명과 패스워드를 Base64 인코딩 해서 보낸다. 위 예제 코드와
[그림 2]의 Authorization 헤더를 보면 Base64 인코딩 값이 똑같은 것을 알 수 있다.
그러면 스크립트 작성 시 계정명과 패스워드를 Base64 인코딩해서 보내야겠네? 라고 생각할 수 있지만 Python requests 모듈에는 Authorization 헤더에 계정 정보를 담아서 보낼 수 있는 별도의 옵션이 존재하며 또 자동으로 Base64로 인코딩도 해준다.
[그림 3]과 같이 requests 모듈로 GET 또는 POST 요청 시 auth 인자를 통해 Authorization 헤더에 Base64 인코딩된 계정 정보를 담아서 보낼 수 있다.
마무리
웹 취약점 진단 시 Apache-Tomcat을 만날 경우 관리 계정에 대한 무작위 공격 대입 시 유용하게 사용할 수 있는 도구를 살펴봤다. 직접 스크립를 작성해서 사용할 수도 있겠디만 이렇게 공개되어 있는 코드를 가져다 쓰고 필요 시 수정해서 쓴다면 진단 소요 시간을 절약할 수 있기에 필요한 사람들은 위 링크된 깃 허브에서 다운로드 받아 쓰면 되겠다.
'웹(WEB)' 카테고리의 다른 글
URL 디렉터리 브루트 포스 도구(dirb, gobuster, DirBuster) (0) | 2023.08.29 |
---|---|
버그 바운터들의 공격 도구 nuclei(뉴클리어) (0) | 2023.07.06 |