파이썬 requests 라이브러리를 활용한 웹 취약점 점검

웹 취약점 점검에 Burp-Suite와 같은 상용(혹은 free) Proxy 도구를 많이 사용하긴 하지만
특정 영역에서 취약점을 발견했을 경우 상용 도구에서 제공되는 부가기능(Intruder 등)을 쓰기 보다는
Python을 통해 직접 도구를 제작하는 것이 효율적일 때가 있다.

파이썬에서 http 통신을 위해 가장 기본적으로 사용되는 라이브러리에는 socket, urllib(2) 등이 있지만
아래 소개할 requests 를 사용하면 아주 간편하고 빠르게 공격 도구를 제작할 수 있다.

본 포스팅 내용은 아래 공식 페이지 내용을 참고하여 작성하였음을 미리 밝힌다.
http://docs.python-requests.org/en/latest/

 

설치 방법

pip 혹은 easy_install 도구를 통해 간편하게 설치가 가능하며, git 을 통한 수동 설치도 지원한다.

설치가 끝나면 정상적으로 라이브러리가 import 가 되는지 파이썬을 열어 확인해보자

오류 없이 정상적으로 설치 된 것을 확인할 수 있다.
이제 본격적으로 requests 라이브러리를 활용해보도록 하자.

 

GET / POST 요청(request)과 응답(response) 받기

라이브러리를 불러오는(Importing) 것은 다음 한 줄이면 충분하다.

공격 대상 웹 서비스가 GET 메서드를 지원하는 경우 다음과 같이 Request를 생성한다.

url을 별도로 분리해 놓은 것은 추후에 코딩시에 유연성을 높이기 위해서이며,
직접 get(‘대상주소’) 형식으로 입력해도 무방하다.

위와 같이 get 메서드를 호출하게 되면 응답 값에 대한 객체가 “r” 에 부여되며,
앞으로도 이 객체를 사용하여 url 에 관련된 정보를 수집할 수 있다.

GET 이 아닌 POST 방식의 경우 다음과 같이 파라미터를 딕셔너리 형태로 정의한 후
post 메서드 호출 시 인자값으로 전달하면 된다.

Response(응답) 값은 아래와 같이 r.text를 통해 가져올 수 있다.

json 타입의 Response의 경우도 r.json()을 통해 가져올 수 있으며, 응답값 내용을 분석 후
원하는 값을 Parsing 하는 작업도 간편하게 할 수 있다.

 

Custom Header 설정

requests 라이브러리는 사용자가 직접 Header 값을 작성하여 Request 전송이 가능하다.
Post 요청시 파라미터 값을 넣었던 방식과 동일하게 딕셔너리 형태로 header 를 작성한 후
GET / POST 호출 인자값에 추가시켜준다.

 

Bruteforce 공격도구 제작하기

파이썬 라이브러리는 사용하기 매우 직관적이기 때문에 위에서 다룬 내용만으로도
충분히 공격 도구를 제작할 수 있다.

실제 케이스를 바탕으로 좀 더 자세히 샆펴보도록 하자.


“특정 웹사이트를 대상으로 모의해킹을 하던 도중, [회원 정보 조회] 페이지에 대한
세션 처리가 미흡하여 타 회원의 정보를 조회할 수 있는 취약점을 발견하였다.
단, 타 회원의 정보는 8자리 랜덤 영문자+숫자 포맷으로 구성되어 있었다”


 

실제 웹사이트 모의해킹을 하다보면 위와 같은 케이스를 매우 빈번하게 접할 수 있다.
특히, 회원 정보 / 상품구매 이력 등 개인의 민감한 정보와 관련된 페이지에서
인증 처리가 미흡하거나, 회원 구분을 단순 숫자값으로 구성하고 있을 경우는 문제가 될 수 있다.

취약한 웹 서비스의 주소를 “www.example.com/info/profile/{profile-id}” 라고 가정한 후,
공격 코드를 한단계씩 만들어 보자.

먼저 회원 profile-id 를 구성하는 랜덤 8자리 영문자+숫자 조합을 만들기 위해
파이썬의 itertools 라이브러리를 사용해보도록 하자.

8자리 id가 생성되긴 하나 itertools 라이브러리 특성상 알파벳 순차적으로 생성되기 때문에
공격용으로 쓰기에는 적절해보이지 않는다 (물론 상황에 따라 이것이 더 효율적인 경우도 있다)

random 라이브러리를 사용하여 다른 방법으로 id를 생성해보았다.

확률적으로 어떤 것이 profile-id를 찾는데 더 효율적인지는 확인할 수 없으나,
itertools의 순차적으로 생성된 id가 아닌 랜덤하게 생성된 id를 사용하여 도구를 만들 예

이제 남은 것은 앞서 다룬 Requests 라이브러리를 통해, 임의로 생성한 profile-id를 요청한 후,
Response Code를 통해 의미있는 페이지와 아닌 것을 구분하기만 하면 된다.

남은 코드를 완성해보도록 하자.
Custom Header의 경우 Burp Suite를 통해 Request 부분을 그대로 복사한 후,
그대로 Dictionary 타입으로 변환하여 넣어주면 된다. (아래 코드 헤더 영역 참조)

 

공격 환경이 Proxy Server를 사용하고 있을 경우에는 request 옵션에 “proxies” 를 넣어주면
정상적으로 커넥션을 맺을 수 있다.

이상으로 파이썬의 requests 라이브러리에 대해 간단하게 알아보았다.
사실 urllib(또는 urllib2) 가 사용하기 더 편하다면 그것을 사용해도 무방하다.

위 예제는 PoC 목적으로 짜여진 코드이므로, 직접 사용하기 보다는
해킹 대상 서버와 주고 받는 값들을 우선적으로 면밀히 분석한 후, 최종 자동화툴을 만들 때
참고해서 사용하는 것이 좋겠다.

 

Site Footer

Sliding Sidebar

About Me

About Me

June Park