EstSoft 부트캠프를 듣고있다.
그 중 수업에선 다루지 않은 칼리리눅스를 설치하고 직접 공격해보는 시간을 갖자. (우분투에서 할 수 있는 실습 포함 )
기본 설정을 끝낸 모습.
간단히 디렉토리 리스팅부터 들어가보자.
웹 서버에서 접속자가 디렉토리 구조나. 파일명을 쉽게 파악하고 다운로드 할 수 있게 하는것이 목적이다.
취약점이라고 보기 어렵다는 의견도 있으나 공격자가 공격 대상으로 삼고 웹 서버의 구조를 정보를 수집하기 쉽고. 이는 취약점이 될 수 있다. 의도하지않은 파일도 노출될 수 있기때문.
특히. 비밀번호. DB 백업 정보. 설정파일등이 들어있으면 심각한 정보 유출의 위험이 있다.
Apache 설정 파일이나 . htacecess에서 해당 디렉토리에 Directoryindex 설정이 없고. index.html, index.php 파일이 없기때문에 자동으로 디렉토리 내용을 보여주는 기본 동작이다.
간단히 공격을 시도해보자.
kali linux에서 제공하는 gobuster라는 툴을 이용해 숨겨진 파일이나 디렉토리를 찾아보자.
.htaccess = 디렉토리별 Apache 설정 파일. 특정 디렉토리에 접근 제한. 리다이렉션. 암호화등의 정보를 담음
.htpasswd = 사용자 인증 정보가 들어있는 파일 ( ID : 해시된 비밀번호)
.hta = windows 실행 관련 스크립트
모두 접근 한다면 공격을 할 수 있는 파일들이다. 하지만 현재 상태가 403임으로. 존재는 하지만 접근이 금지된 상태이다. 공격을 시도해보자.
kali linux를 이용해 공격해보자.
curl -i http://192.168.100.11/board/pds/.htpasswd
일반적인 curl 요청을 보내보자. 여전히 403이 뜬다.
curl -i -H "X-Original-URL: /board/pds/.htpasswd" http://192.168.100.11/
요청을 보내보자. 구문을 해석하자면
Curl : HTTP 요청을 보내자
-i ( HTTP 헤더를 포함해서 출력하고.)
-H "X-Original-URL: /board/pds/.htpasswd" 헤더를 하나 더 추가해 /board/pds/.htpasswd로 접근하고 싶다고 리다이렉션을 요청한다.
어라? 접속은 됐다. 근데 잘 읽어보니 요청은 서버가 받아들였으나. X-orginal-URL을 무시했거나. 요청경로말고 그냥 기본페이지를 응답한것 같다.
kali로 Nmap을 날려보자. 디렉토리 리스팅에서 받았던 정보랑 크게 다를건 없는거같다.
하지만 65001. 445. 139 포트가 열려있다는걸 또 알 수 있었다.
고버스터를 이용해 진단했을때 . 일단 접근 가능한건 없으니 /board 이후 폴더를 좀 봐야할거같다. /board를 들어가니 다음과 같은 창이 나왔다
그래. 여기서 한번 공격해보자. 책에서 나온 예제대로 ID = admin. paswwd 'or'=''로 뚫어보자.
잘된다. 그냥 구문 자체로 뚫리는거면 여러가지 구문들을 집어넣을 수 있다. 먼저 SQL 인젝션의 대표 구문
ID : 'OR 1=1-- - // ( ' 문자열 닫음). OR 1=1 -> 참조건 -- 비밀번호 조건 전부 주석처리
Passwd : 아무거나 상관없음.
잘 통과된다.
나머지
admin' --, ' OR 'a'='a '), OR ('1'='1 는 모두 실패했다.
아마 뒤에 비밀번호 조건이 살아있어서 실패하거나. 서버쿼리에서 유효하지 않은 명령들인가보다.
대부분의 SQL 로그인 쿼리는 다음과 같다.
SELECT * FROM users WHERE id = '[ID]' AND pw = '[PW]'
이때. ID에 대입해서 성공했던 조건들을 찾아보면. 모두 비밀번호 조건을 주석처리해서 통과한 경우다.
첫번째 경우 = SELECT * FROM users WHERE id = '' OR 1=1 -- -' AND pw = 'abc' 은
-- 이후는 모두 무시되기때문에. WHERE id = '' OR 1=1 -> 참 이기에 통과. pw는 체크하지 않음
두번째 경우 SELECT * FROM users WHERE id = '' OR 1=1 # ' AND pw = 'abc' #도 마찬가지로 mysql에서
주석처리되기때문에. 무조건 통과된다.
세번째 경우는 조금 다른데. SELECT * FROM users WHERE id = 'admin' OR '1'='1' AND pw = 'abc'
이 경우. OR '1'='1'은 항상 참이다.
쿼리 평가 순서가 (id = 'admin') OR (('1'='1') AND (pw = 'abc')) 와 같다면. -> ID 구문에서는
모두 참이기때문에. passwd가 맞는지. 확인이후 패스워드까지 맞다면 통과되는 구조고.
(id = 'admin' OR '1'='1') AND pw = 'abc' 처럼 괄호가 없이 처리 된다면 둘중에 하나만 참이라면.
(admin)이 맞다면. 비밀번호가 상관없이 로그인이 성공하는 구조인것이다.
똑같이 ID 만 변경해서 OR'1'=1 공격을 시도해보면. admin이 일치하지 않기때문에 막히는 구조이다.
게시판에
<SCRIPTS>alert("XSS ATTACK!");</SCRIPTS>
라고 작성한 후 게시글을 열어보자.
이런 메세지가 뜬다. XSS 공격 성공!
웹 애플리케이션의 대표적인 취약점으로. 사용자가 입력한 값을 검사하지 않은 경우에 발생한다.
정상적인 글이 아닌 악성 스크립트를 삽임하여 비정상적인 방법으로 사용자의 인증정보인 쿠키,세션정보등을 탈취한다.
추가적으로
webshell 업로드 공격을 해보자. 기존 게시판에 글쓰기를 입력후 . webshell.php 파일을 업로드 한다.
칼리 리눅스에서 접속해 웹 서버 내부 시스템에 접근 할 수 있다.
마지막으로 칼리리눅스의 툴중에 하나인 hydra를 통해 brute force attack 을 시도해보자.
공격에 앞서 ctrl + U 를 눌러 소스코드를 보자. 혹은 curl을 통해서도 접근이 가능하다.
코드를 분석해보면. POST 로 id.pw를 login_chk.php에 전송하여 로그인을 진행한다.
칼리리눅스에서 터미널을 열고 hydra로 무차별 대입 공격을 시도해보자.
hydra -l admin -P /home/kailuser/passwd.txt 192.168.100.11 http-post-form "/board/login_chk.php:id=^USER^&pw=^PASS^:fail" -V
기본 제공되는 rockyou.txt를 이용하는 방법도 있지만. 약 14344399개가 있으니 모두 일치하려면 시간이 너무 오래걸릴것이라. 사전파일을 만들어 시도했다. 그전에 sql 인젝션을 할때 admin이라는 아이디가 일치한다는걸 알았으니. 로그인 아이디는 admin으로 고정한 상태에서 시도하자.
뚫렸다. login id = admin. passwd=admin1234였다.
무차별 대입공격은 맨땅에 헤딩하는 방식이다.
가능한 모든 조합을 무식하게 하나하나 시도하기때문이다.
허나 현대사회에서는 간단한 captcha 인증 하나로도 막히기때문에. 공격 대상시스템에 로그인 실패에 대한 제한이 없거나. 속도 제약이 느슨할 때 많이 사용한다 .
웹해킹 실습 1은 여기서 마친다.