tag:blogger.com,1999:blog-2291586570342393192024-02-20T13:26:26.026+07:00Thailand's Computer Forensics and Incident Response Blogความรู้เล็กๆน้อยๆเกี่ยวกับ Incident Response และ Computer Forensics น่ะนะ อาจมีอื่นๆแทรกเข้ามาบ้าง :) ถ้าสนใจแลกเปลี่ยนความคิดเห็นก้อฝาก comment ไว้คุยกันได้นะครับTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.comBlogger24125tag:blogger.com,1999:blog-229158657034239319.post-59609357754242774892008-07-21T15:12:00.003+07:002008-07-21T16:35:04.432+07:00Volatility กับ Live Forensicsคำว่า volatility ถ้าคนที่เรียนคอมมาก็คงเคยได้ยินกันมาไม่มากก้อน้อย คำๆนี้หมายถึง ลักษณะบางอย่างของอุปกรณ์คอมพิวเตอร์ที่สามารถเก็บข้อมูลเมื่อมีไฟเลี้ยง และข้อมูลจะหายไปเมื่อไม่มีไฟเลี้ยง ซึ่งโดยปกติแล้วมักจะหมายถึง RAM นั่นเอง แต่ที่เราจะกล่าวกันในวันนี้นั้นไม่ใช่วิชาพื้นฐานคอมพิวเตอร์ครับ แต่เป็นวิชา Forensics และ <span style="font-weight: bold; color: rgb(51, 102, 255);">Volatility</span> ที่จะกล่าวถึงในวันนี้ก็ไม่ใช่อาการดังกล่าวครับ แต่เป็น tools ที่ช่วยให้ชีวิตง่ายขึ้น<br /><br /><a href="https://volatilesystems.com/default/volatility">Voliatility</a> เป็น tools ไว้ใช้สำหรับการวิเคราะห์ <span style="font-weight: bold; color: rgb(255, 0, 0);">memory image</span> ครับ หากใครไล่อ่านเนื้อหาอันไร้สาระมาตลอดก็จะพอทราบได้มีคนพัฒนาสคริปต์ต่างๆ เพื่อช่วยสำหรับการวิเคราะห์ memory image อยู่บ้างแล้ว เช่น <span style="font-weight: bold; color: rgb(0, 153, 0);">lsproc</span> ซึ่งตัวสคริปต์ดังกล่าวนั้นเป็นเพียง Proof of Concept และสามารถใช้ได้กับ image ของระบบปฏิบัติการ Windows 2000 เท่านั้น ไม่สามารถใช้กับ image ของ XP หรือ 2003 ได้ (ผมเขียน lsproc สำหรับ XP และ 2003 ไว้แล้ว แต่สำหรับสคริปต์อื่นๆนี่ไม่ไหวครับ เกิด error) แต่ก็มีกลุ่มคนสนใจและพัฒนาสคริปต์ต่างๆจนกระทั้งกลายเป็นเจ้า Volatility ขึ้นมาซึ่งสามารถทำงานได้กับ image ของ XP และ 2003 ได้ครับ วันนี้ผมจะนำภาพบางส่วนจากการใช้งานจริงของเจ้า Volatility มาให้ดูกันครับ<br /><br />ความสามารถแรกคือการแสดงรายชื่อของโปรเซสที่รันขณะที่ทำการ image memory มา ซึ่งความสามารถนี้ก็คือ lsproc ที่เราคุ้นกันนั่นเองครับ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=v01.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/v01.png" alt="Photobucket" border="0" /></a><br /><br />ข้อแตกต่างระหว่างผลลัพธ์ของ lsproc กับ Volatility คือ lsproc นั้นจะมีแสดงข้อมูลของโปรเซสที่หยุดการทำงานไปแล้ว และตำแหน่งของ physical address ของโปรเซสแต่ละโปรเซสด้วย แต่ทว่าถ้าอยากได้ข้อมูลครบแบบ lsproc แล้วละก็ Volatility ก็สามารถทำได้ครับ โดยใช้ความสามารถในการแสกนหา EPROCESS ใน memory image ดังภาพ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=v02.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/v02.png" alt="Photobucket" border="0" /></a><br /><br />เหมือนกันเด๊ะๆ แต่สังเกตว่าพอให้เทคนิคสแกน EPROCESS นั้น Volatility จะทำงานช้ากว่าการเลือกแสดงโปรเซสเพียวๆ อาจเป็นไปได้ว่าใช้คนละ algorithm ในการค้นหา<br /><br />พอก่อนละกันวันนี้ เด๋วมาต่อตอนสองใหม่Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-51553190051682158952008-06-11T15:13:00.002+07:002008-07-21T15:11:35.123+07:00ทำ data-carving บน memory image ของโทรศัพท์มือถือสวัสดีครับวันนี้มีโจทย์ forensics มาอีกแล้ว ^_^ โดยเจ้าของโจทย์อยากทราบว่า memory image ที่ได้จากโทรศัพท์มือถือมีไฟล์อะไรอยู่บ้าง ซึ่งเทคนิคที่เราจะใช้ในการค้นหาครั้งนี้เรียกว่า <span style="font-weight: bold; color: rgb(51, 102, 255);">data-carving</span> ครับ<br /><br />data-carving เป็นเทคนิคการค้นหาไฟล์จาก image ต่างๆไม่ว่าจะเป็น image ของ harddisk, memory, หรือ USB storage โดยการค้นหาดังกล่าวนี้จะอาศัยการ<span style="font-weight: bold; color: rgb(51, 102, 255);">ค้นหา header </span>ของประเภทของไฟล์ที่ต้องการหา ไม่ว่าจะเป็นไฟล์รูปภาพ (.gif, .jpg, .png) ไฟล์เสียง (.mp3, .wav) หรือไฟล์วีดีโอต่างๆ (.avi) โดยหลังจากที่เจอ header ของไฟล์ดังกล่าวแล้ว ก็จะ extract ไฟล์ต่างๆออกมาตามข้อมูลที่ได้จาก header ไฟล์ครับ<br /><br />โปรแกรมที่ใช้สำหรับทำ data carving คราวนี้คือ <a href="http://foremost.sourceforge.net/">foremost</a> ครับ เป็นโปรแกรมฟรีรันบน Linux ดาวน์โหลดมา compile แล้วรันได้ทันทีเลยครับ ตามภาพ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=dc01.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/dc01.png" border="0" alt="Photobucket" /></a><br /><br />สำหรับ image ที่ support โดย <span style="font-weight: bold; color: rgb(51, 102, 255);">foremost</span> นั้นมี image ที่ได้จาก dd ครับ แต่ image ที่ผมได้มานี่ใช้ซอฟต์แวร์ตัวอื่นที่ไม่ใช่ dd ทำ image เอา แต่ก็สามารถอ่านได้เหมือนกัน สำหรับเวลาที่ใช้ในการรันนั้นถือว่าเร็วมากครับ <span style="font-weight: bold; color: rgb(255, 0, 0);">image ขนาด 1GB ใช้เวลาไม่ถึง 10 นาที</span> ซึ่งถ้าเปรียบเทียบกับซอฟต์แวร์กู้ข้อมูลซึ่งใช้เวลาชาติกว่า ถือว่า work มากๆครับ (ผมไม่ได้เทสซอฟต์แวร์กู้ข้อมูลนะครับ เลยไม่ทราบว่าเจ้าของโจทย์ใช้ตัวไหน แต่บอกมาว่าช้ามากๆ)<br /><br />เมื่อ foremost รันเสร็จก็จะสรุปผลให้ครับว่าเจอไฟล์ประเภทใดบ้าง จำนวนกี่ไฟล์<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=dc02.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/dc02.png" border="0" alt="Photobucket" /></a><br /><br />โดยไฟล์ที่ foremost เจอจะถูกสร้างไว้ที่โฟลเดอร์ชื่อ output ครับดังภาพ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=dc3.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/dc3.png" border="0" alt="Photobucket" /></a><br /><br />เข้าไปเลือกดูตามใจชอบเลยครับ ข้อเสียอย่างเดียวของ foremost คือยังไม่ support ไฟล์ประเภท mp3, เละไฟล์ประเภทใหม่ๆบนโทรศัพท์มือถือครับ จบ.Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com2tag:blogger.com,1999:blog-229158657034239319.post-47323333799057447802008-06-02T14:11:00.004+07:002008-06-02T15:27:06.033+07:00การอ่าน ext2/ext3 file system บน Windowsคงมีหลายครั้งที่เวลาทำ forensics เราต้องประสบกับปัญหาเรื่อง <span style="font-weight: bold; color: rgb(255, 0, 0);">compatibility ของ file system</span> ของระบบที่ต่างกัน เช่น อุปกรณ์เก็บข้อมูลต่างๆของเราถูก format เป็น <span style="color: rgb(51, 102, 255); font-weight: bold;">NTFS</span> แต่ ระบบที่เราใช้อ่าน/เขียนข้อมูลลงไปในอุปกรณ์กลับเป็น Linux ซึ่งมีเพียงไม่กี่ตัวเท่านั้นที่สนับสนุนความสามารถในการเขียน NTFS ได้แบบ default ส่วนที่เหลือต้อง compile kernel เอง หรือถ้าเรา format อุปกรณ์เก็บข้อมูลเป็น <span style="color: rgb(0, 153, 0); font-weight: bold;">ext2/ext3</span> ซึ่ง Linux สามารถอ่านเขียนได้ เราจะพบปัญหาอีกว่า Windows ไม่สามารถมองเห็นได้เลย ถ้าเราใช้ Windows เปิดอุปกรณ์ที่ format เป็นแบบ ext2/ext3 เราจะพบความเอ๋อๆดังภาพ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=emsg.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/emsg.png" alt="Photobucket" border="0" /></a><br /><br />แน่นอน เราไม่สามารถ format ได้ เพราะข้อมูลจะหายหมด - -" ... แล้วมันมีวิธีไหนบ้างหว่าที่สามารถทำให้ Windows อ่าน ext2/ext3 ได้ ?<br /><br />คำตอบคือมีหลายวิธีเลยครับ ไล่ตั้งแต่ติดตั้ง <span style="font-weight: bold; color: rgb(255, 102, 0);">driver</span> ซึ่งทำขึ้นมาเพื่อ support ext2/ext3 โดยเฉพาะ จนถึง <span style="font-weight: bold; color: rgb(255, 102, 0);">application</span> ที่ support การอ่าน ext2/ext3 ในตัวเลย ใน entry นี้ผมจะกล่าวถึงตัวหลังนะครับ เพราะตัวแอพพลิเคชั่นที่ผมจะกล่าวถึงต่อไปนี้สามารถ<span style="color: rgb(51, 102, 255); font-weight: bold;">ใช้อ่านและ copy ได้อย่างเดียว</span>ครับ ไม่สามารถเขียนได้ ซึ่งหลายๆคนอาจจะไม่ีสะดวก แต่สำหรับการทำ forensics ถือว่ามีประโยชน์ครับเพราะมีส่วนช่วยป้องกันทำการเขียนทับข้อมูล evidence ที่เราเก็บมาจากระบบครับ ถ้าใครอยากให้สามารถทั้งอ่านและเขียนได้เลย ผมแนะนำว่าใช้ตัวนี้ดีกว่าครับที่ <a href="http://www.fs-driver.org/">fs-driver.org</a><br /><br />สำหรับตัวที่ผมใช้ชื่อว่า <a href="http://www.diskinternals.com/linux-reader/">linux-reader</a> ครับ หน้าตานี่เหมือน <span style="font-weight: bold; color: rgb(51, 102, 255);">Windows Explorer</span> เลยครับ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=linuxreader.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/linuxreader.png" alt="Photobucket" border="0" /></a><br /><br />Linux-Reader จะแบ่งมุมมองออกเป็น 3 ส่วนครับ คือ harddisk ที่มีในระบบ, removeable disk และ physical disk จริงๆที่มีอยู่ในระบบ โดย Linux-Reader จะไม่สามารถเข้าไปอ่านพื้นที่ที่เป็น NTFS ได้ หากเราใช้ Linux Reader เข้าไปอ่าน มันจะฟ้องดังภาพ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=emsg2.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/emsg2.png" alt="Photobucket" border="0" /></a><br /><br />ส่วนอุปกรณ์ที่เป็น ext2/ext3 นั้นมันจะขึ้น label ว่า <span style="font-weight: bold; color: rgb(51, 102, 255);">Linux Native Volume</span> (ดูภาพข้างบนนู้นประกอบ) และเมื่อเรียกเข้าไปดูจะเป็นดังภาพครับ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=content.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/content.png" alt="Photobucket" border="0" /></a><br /><br />เราสามารถนำไฟล์ดังกล่าวออกมาใช้งาน/ตรวจสอบได้ครับ นอกจากนี้แล้วเจ้า Linux-Reader นี้ยังมีความสามารถในการ mount image ของ linux ที่สร้างขึ้นจาก <span style="font-weight: bold; color: rgb(0, 153, 0);">dd</span> ได้อีกด้วย ลองไปเล่นดูนะครับ<br /><br />P.S. การนำไฟล์จาก Linux-Reader ไปใช้ ให้ click ขวาที่ไฟล์/โฟลเดอร์และเลือก save ครับTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-3140693428752777602008-05-23T20:46:00.004+07:002008-05-23T21:30:27.305+07:00การ repair ไฟล์ Event Log ของระบบปฏิบัติการ Windows ที่ Corruptedสวัสดีครับ ไม่ได้อัพนาน ล็อกอินเข้ามาเจอคำถามค้างไว้เป็นเดือนๆเลย - -" ตอบให้แล้วนะครับ อย่าถือโทษโกรธกันเลยนะครับ ^_^<br /><br />มานั่นไล่ดู ผ่านมาครึ่งปีถ้าไม่นับ entry นี้นี่ปี 2008 เพิ่งโพสไป entry เดียวเอง ทำไมเราช่างขี้เกียจอย่างนี้ ว่าแล้วก็เลยสวมบทมนุษย์ active ซะหน่อย เดี๋ยวสมองจะสนิมขึ้น หาเรื่องมาโพสต์ให้ครับ โดยวันนร้จะโพสต์เกี่ยวกับเรื่อง <span style="color: rgb(51, 51, 255);"><span style="font-weight: bold;">Event Log</span> </span>ของระบบปฏิบัติการ Windows ครับ<br /><br />Event Log ก็คือล็อคไฟล์ของระบบปฏิบัติการ Windows ครับ เป็นไฟล์ที่ลงท้ายด้วย <span style="font-weight: bold; color: rgb(51, 51, 255);">.Evt</span> จะอยู่ที่ <span style="color: rgb(0, 153, 0); font-weight: bold;">C:\WINDOWS\system32\config</span> โดยปกติแล้วจะมีทั้งหมด 3 ไฟล์ครับคือ <span style="font-weight: bold; color: rgb(51, 51, 255);">AppEvent.Evt</span>, <span style="color: rgb(51, 51, 255); font-weight: bold;">SecEvent.Evt </span>และ <span style="font-weight: bold; color: rgb(51, 51, 255);">SysEvent.Evt</span> ซึ่งก็คือล็อคไฟล์ของ <span style="font-weight: bold; color: rgb(51, 51, 255);">Application</span>, <span style="font-weight: bold; color: rgb(51, 51, 255);">Security</span> และ <span style="font-weight: bold; color: rgb(51, 51, 255);">System</span> ของระบบปฏิบัติการ Windows ตามลำดับครับ (อาจมีไฟล์อื่นๆอีกตามแอพพลิเคชั่นที่ติดตั้งลงบนเครื่องครับ แต่ตัวหลักจะเป็นสามตัวนี้) หากใครทำ forensics หรือ incident handling/response บน Windows บ่อยๆ ก็คงเคยเจออาการที่ว่า Event Log ที่ copy ออกมานั้นเปิดด้วย <span style="font-weight: bold; color: rgb(255, 0, 0);">Event Viewer</span> ไม่ได้ อาการเอ๋อๆดังภาพข้างล่างใช่มั้ยครับ ^_^<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=corruptedevt.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/corruptedevt.png" alt="Photobucket" border="0" /></a><br /><br />อาการที่ปรากฏในภาพคือ ไฟล์ evt ทั้งหลายที่เรา copy มามัน corrupted ครับ - -" สาเหตุนั้นเกิดจากเราไม่ได้หยุด services ที่เก็บ Log ของ Windows ครับ ชื่อว่า <span style="font-weight: bold; color: rgb(51, 51, 255);">EventLog</span> ครับ เหตุการณ์เอ๋อๆของไฟล์ .Evt นี้นี่นับว่าเป็นเหตุการณ์ปกติมากครับ โดยเฉพาะอย่างยิ่งหากนำไฟล์ .Evt ที่ได้จากการ image harddisk มาใช้ครับ ซึ่งหากว่าคนที่ทำ forensics ไม่ได้ตรวจสอบและนำไฟล์เหล่านี้ไป feed ให้โปรแกรมพวก Log Analyzer ต่างๆแล้วล่ะก้อ.... ขึ้นอยู่กับดวงล่ะครับ ว่า Log Analyzer ตัวนั้นมันเก่งขนาดไหน<br /><br />คำถาม: แล้วจะแก้ไขยังไงดี ?<br /><br />สาเหตุที่ไฟล์ corrupted เพราะ header ไฟล์ของ Event Viewer มันเน่าครับ ถ้าอยากทราบว่าทำไมเน่าให้ไปอ่าน <a href="http://www.dfrws.org/2007/proceedings/p92-murphey.pdf">paper ของ Rich Murphey</a> ครับ บรรยายไว้ละเอียดเหมือนกัน แต่...เราไม่ต้องใช้ hex edit เปิดแก้ header ครับ มีวิชามารที่สบายกว่านั้น ใช้โปรแกรมที่ชื่อว่า <a href="http://www.murphey.org/code/fixevt.exe">FixEvt </a> ครับ Rich Murphey เขียนไว้แล้ว เป็น command line ครับ แค่พิมพ์สั้นๆว่า<br /><br /><span style="font-weight: bold; color: rgb(0, 153, 0);">C:\Documents and Settings\trirat\Desktop\Corrupted.Event.Log>fixevt.exe *.Evt</span><br /><span style="font-weight: bold; color: rgb(0, 153, 0);">Repaired: AppEvent.Evt</span><br /><span style="font-weight: bold; color: rgb(0, 153, 0);">Repaired: SecEvent.Evt</span><br /><span style="font-weight: bold; color: rgb(0, 153, 0);">Repaired: SysEvent.Evt</span><br /><br />ถ้าขึ้นว่า Repaired ข้างหน้าชื่อไฟล์ .Evt แสดงว่าซ่อมได้ครับ ;)<br /><br />จบ...Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com2tag:blogger.com,1999:blog-229158657034239319.post-71776289212662860862008-02-20T13:32:00.002+07:002008-05-02T16:51:16.620+07:00ว่าด้วยเรื่องของ Slack Spaceพอดีมีคนอยากรู้คำศัพท์ที่เกี่ยวข้องกับ forensics ครับ สัญญาไว้แล้ว เลยก่ะว่าทยอยๆเขียนลง blog ซะเลย วันนี้เลยเริ่มที่คำนี้ครับ "<span style="font-weight: bold; color: rgb(51, 51, 255);">Slack Space</span>"<br /><br />...แต่เพื่อให้สามารถเข้าใจคำว่า Slack Space มากขึ้น จะขออธิบายเกี่ยวกับลักษณะการเก็บข้อมูลของฮาร์ดดิสก์ก่อนนะครับ เพราะคำว่า Slack Space นี้เกี่ยวข้องกับฮาร์ดดิสก์โดยตรงครับ :)<br /><br />โดยปกติแล้วลักษณะรูปทรงของฮาร์ดดิสก์นั้นจะเป็นแผ่นวงกลมซ้อนกันหลายๆแผ่น ซึ่งในแต่ละวงกลมนั้นจะถูกแบ่งออกเป็นชั้นๆเรียกว่า<span style="color: rgb(51, 51, 255);"> <span style="font-weight: bold;">Track</span> </span>ดังรูป<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=SlackSpaceTrack.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/SlackSpaceTrack.png" border="0" alt="Photobucket" /></a><br /><br />โดยปกติแล้วในแต่ละวงจะมีจำนวน Track อยู่ทั้งหมด 1024 tracks โดย Track แรกสุดหรือที่เรียกกันว่า Track 0 นั้นจะเป็น Track ที่อยู่ด้านนอกสุดของวงกลม ถัดเข้ามาจะเป็น Track 1, 2, 3, ... ตามลำดับ<br /><br />ในแต่ละ Track นั้นจะถูกแบ่งย่อยออกเป็นส่วนย่อยเล็กลงไปอีก เรียกว่า <span style="font-weight: bold; color: rgb(51, 51, 255);">Sector</span> ดังรูป<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=SlackSpaceSector.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/SlackSpaceSector.png" border="0" alt="Photobucket" /></a><br /><br />Sector เรียกได้ว่าเป็นหน่วยที่เล็กที่สุดของฮาร์ดดิสก์ก็ว่าได้ โดยปกติแล้วมีขนาด 512 bytes ครับ<br /><br />Sector หลายๆอันที่อยู่ติดกันและระบบปฏิบัติการนำไปใช้สำหรับเก็บข้อมูลจะถูกเรียกว่า์ <span style="font-weight: bold; color: rgb(51, 51, 255);">Cluster</span> ดังรูป<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=SlackSpaceCluster.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/SlackSpaceCluster.png" border="0" alt="Photobucket" /></a><br /><br />เออ... แล้วที่พูดมานี่มันเกี่ยวอะไรกับ Slack Space เหรอ ??? เกี่ยวครับ :) เพราะ Slack Space คือพื้นที่ว่างส่วนที่เหลือของ Cluster หลังจากใช้ในการเก็บข้อมูลครับ ดังภาพ<br /><br /><a href="http://s136.photobucket.com/albums/q196/triratp/Incident/?action=view&current=SlackSpace.png" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/SlackSpace.png" border="0" alt="Photobucket" /></a><br /><br />เรามาดูตัวอย่างง่ายๆเทียบกับรูปข้างบนกันดีกว่า ให้ไฟล์ที่ต้องการเก็บมีขนาด 1200 bytes และกำหนดให้ระบบปฏิบัติการมีขนาดของ Cluster คือ 2048 bytes (เท่ากับ 4 sectors นั่นเอง) จะได้ว่า ไฟล์ที่เก็บลงไปในนั้นจะใช้พื้นที่ไป 1200 bytes ซึ่งกินที่ไป 2 sectors กว่า และเหลือพื้นที่อีก 848 bytes ซึ่งพื้นที่ส่วนที่เหลือนี้โดยปกติแล้วระบบปฏิบัติการจะไม่นำไปใช้งานในการเก็บไฟล์อื่นๆ้อีก<br /><br />แล้วมันเกี่ยวยังไงกับ forensics หว่า ??? เกี่ยวตรงที่ผู้บุกรุกที่มีทักษะสูงขึ้นมาหน่อย มักนำไฟล์ต่างๆของตนเองไปเก็บไว้ที่ Slack Space น่ะสิ (สามารถทำได้โดยใช้โปรแกรมที่เขียนขึ้นมาเพื่องานนี้โดยเฉพาะ) ข้อดีของการซ่อนไฟล์ไว้ใน Slack Space คือไม่เป็นที่สะดุดตา และสามารถตรวจสอบได้ยากครับ<br /><br />ยังกับบรรยายให้เด็กๆฟังเรื่องฮาร์ดดิสก์เลยแฮะ์<br /><br />เออ...ขอจบแบบห้วนๆละกัน ช่วงนี้มีอาการนอย T-TTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-45086444831536482992007-12-12T10:44:00.000+07:002007-12-12T16:27:26.240+07:00USB forensics ตอนที่ 2: จะรู้ได้ยังไงว่าเวลาไหนคือเวลาล่าสุดที่เสียบ USB thumb drive เข้าเครื่องช่วงนี้หมกมุ่นอยู่กับ USB ก็เลยกลายเป็น series ที่เกี่ยวกับ USB ไปซะงั้น post เมื่อคราวก่อนเลยกลายเป็น <a href="http://trirat-puttaraksa.blogspot.com/2007/12/usb-thumb-drive.html">USB forensics ตอนที่ 1</a> ไปซะงั้น สำหรับในตอนที่ 2 นี้จะกล่าวถึงการดูเวลาครั้งสุดท้ายที่ USB thumb drive ถูกเสียบเข้าเครื่องคอมพิวเตอร์ที่ต้องสงสัย ซึ่งจะใช้ข้อมูลจากในตอนที่ 1 พอสมควรดังนั้นถ้าคราวนี้แล้วยังมึนๆก้อกลับไปอ่านให้เข้าใจก่อนนะครับ จะได้มึนน้อยลง<br /><br />ในตอนนี้เราจะใช้ USB thumb drive คือ <span style="color: rgb(0, 153, 0); font-weight: bold;">Kingmax USB Flash Disk Rev 2.00</span> ซึ่งมี serial number คือ <span style="font-weight: bold; color: rgb(0, 153, 0);">EC5543658C8B00EA&0</span> หรือ <span style="font-weight: bold; color: rgb(0, 153, 0);">EC5543658C8B00EA</span> ถ้าดูใน <span style="font-weight: bold; color: rgb(51, 102, 255);">UVCView</span> ให้เราเข้าไปที่ registry key ที่เกี่ยวข้องกับอุปกรณ์ USB ดังกล่าวคือ<br /><br /><span style="color: rgb(102, 102, 102);">HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\</span><br /><span style="color: rgb(102, 102, 102);">Disk&Ven_KINGMAX&Prod_USB_Flash_Disk&Rev_2.00\</span><br /><span style="color: rgb(102, 102, 102);">EC5543658C8B00EA&0</span><br /><br /><br />จะปรากฏข้อมูลต่างๆที่เกี่ยวข้องกับอุปกรณ์ตรงด้านขวามือดังภาพ<br /><br /><a href="http://photobucket.com" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/USBSTOR4.png" border="0" alt="Photo Sharing and Video Hosting at Photobucket" /></a><br /><br />ข้อมูลที่เราสนใจคือ <span style="font-weight: bold; color: rgb(51, 102, 255);">ParentIdPrefix</span> ซึ่งในที่นี้คือ <span style="font-weight: bold; color: rgb(0, 153, 0);">7&24e36f51&0</span> เด๋วจะได้อธิบายต่อไปว่าใช้ทำอะไรได้<br /><br />การดูเวลาครั้งสุดท้ายที่ USB thumb drive ถูกเสียบเข้าเครื่องนั้นเราจะอาศัย<a href="http://trirat-puttaraksa.blogspot.com/2007/04/last-write-time-registry.html">การดู Last Write Time ของ registry key</a> ที่เคยกล่าวไว้ใน post แรกของ blog นี้เลยครับ :) ให้เข้าไปที่ registry key ดังต่อไปนี้<br /><br />HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\<br /><br />และเข้าไปยัง subkey ทั้งสองอันนี้ครับ<br /><br /><span style="color: rgb(0, 153, 0);">{53f56<span style="font-weight: bold;">307</span>-b6bf-11d0-94f2-00a0c91efb8b}</span><br /><br /><span style="color: rgb(0, 153, 0);">{53f56<span style="font-weight: bold;">30d</span>-b6bf-11d0-94f2-00a0c91efb8b}</span><br /><br />registry ดังกล่าวจะเกี่ยวข้องกับอุปกรณ์ disk และ volume ตามลำดับครับซึ่ง USB thumb drive ของเราเข้าข่ายพอดี<br /><br />มาดูที่ <span style="color: rgb(0, 153, 0);">{53f56<span style="font-weight: bold;">307</span>-b6bf-11d0-94f2-00a0c91efb8b} <span style="color: rgb(102, 102, 102);">ก่อนครับ เมื่อคลิกเข้าไปจะเห็นเป็นดังภาพ<br /><br /><a href="http://photobucket.com" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/USBSTOR5.png" border="0" alt="Photo Sharing and Video Hosting at Photobucket" /></a><br /><br />รูปแบบชื่อของแต่ละ sub key เป็นดังนี้<br /><br />##?#<span style="font-style: italic; font-weight: bold; color: rgb(0, 153, 0);">Device</span>#Disk#Ven_<span style="font-weight: bold; color: rgb(0, 153, 0); font-style: italic;">VendorName</span>&Prod_<span style="font-style: italic; font-weight: bold; color: rgb(0, 153, 0);">ProductName</span>&Rev_<span style="color: rgb(0, 153, 0); font-style: italic; font-weight: bold;">Revision</span>#<span style="font-style: italic; font-weight: bold; color: rgb(0, 153, 0);">Serial Number</span>#</span></span><span style="color: rgb(102, 102, 102);">{53f56<span style="font-weight: bold;">307</span>-b6bf-11d0-94f2-00a0c91efb8b}</span><br /><span style="color: rgb(0, 153, 0);"><span style="color: rgb(102, 102, 102);"><br />Device ที่เราสนใจในที่นี้คือ <span style="color: rgb(0, 153, 0); font-weight: bold;">USBSTOR</span> ครับ และเมื่อนำมารวมกับข้อมูลของ USB thumb drive ของเราคือ </span></span> <span style="color: rgb(0, 153, 0); font-weight: bold;">Kingmax USB Flash Disk Rev 2.00</span> ซึ่งมี serial number คือ <span style="font-weight: bold; color: rgb(0, 153, 0);">EC5543658C8B00EA&0 </span><span style="color: rgb(102, 102, 102);">ก็จะได้ว่า subkey ที่เราต้องการดู Last Write Time คือ<br /><br /><span style="color: rgb(0, 153, 0);">##?#USBSTOR#Disk&Ven_KINGMAX&Prod_USB_Flash_Disk&Rev_2.00#EC5543658C8B00EA&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}</span><br /><br />เมื่อดู Last Write Time พบว่าเป็นดังข้างล่าง<br /><br /><span style="color: rgb(51, 102, 255);">Last Write Time: 12/12/2007 - 10:37 AM</span><span style="color: rgb(51, 102, 255);"><br />Value 0</span><span style="color: rgb(51, 102, 255);"><br />Name: DeviceInstance</span><span style="color: rgb(51, 102, 255);"><br />Type: REG_SZ</span><span style="color: rgb(51, 102, 255);"><br />Data: USBSTOR\Disk&Ven_KINGMAX&Prod_USB_Flash_Disk&Rev_2.00\EC5543658C8B00EA&0</span><br /><br />วันที่ 12 ธันวาคม 2007 เวลา 10.37 น. คือเวลาครั้งสุดท้ายที่เสียบ USB thumb drive เข้าไปยังเครื่องที่ทำการตรวจสอบ ไม่ยากเลยชิมิ :)<br /><br />อ้าว....แล้วไอ้เจ้า </span><span style="font-weight: bold; color: rgb(51, 102, 255);">ParentIdPrefix </span><span style="color: rgb(102, 102, 102);">เอาไปทำอะไรหว่า ??? เจ้าค่าตัวนี้จะเอาไปใช้งานกับ sub key </span><span style="color: rgb(0, 153, 0);">{53f56<span style="font-weight: bold;">30d</span>-b6bf-11d0-94f2-00a0c91efb8b} <span style="color: rgb(102, 102, 102);">อีกอันครับ โดยที่เมื่อเี่ราคลิ๊กไปที่ sub key ดังกล่าวจะเห็นเป็นดังภาพ<br /><br /><a href="http://photobucket.com" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/USBSTOR6.png" border="0" alt="Photo Sharing and Video Hosting at Photobucket" /></a><br /><br />รูปแบบของชื่อใน sub key นี้ค่อนข้างจะดูมึนๆเล็กน้อย แต่ sub key ที่เราสนใจนั้นจะมี ParentIdPrefix ของ USB thumb drive ที่เราสนใจปรากฏอยู่ครับ ซึ่งในที่นี้คือ </span></span><span style="font-weight: bold; color: rgb(0, 153, 0);">7&24e36f51&0</span><span style="color: rgb(0, 153, 0);"><span style="color: rgb(102, 102, 102);"> เมื่อเราทำการค้นหา sub key ที่มี ParentIdPrefix ซึ่งจะได้ sub key ชื่อ<br /><br /><span style="color: rgb(0, 153, 0);">##?#STORAGE#RemovableMedia#7&24e36f51&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}</span><br /><br />เมื่อดู Last Write Time ของ sub key ดังกล่าวพบว่าผลลัพธ์เป็นดังข้างล่าง<br /><br /><span style="color: rgb(51, 102, 255);">Last Write Time: 12/12/2007 - 10:37 AM</span><span style="color: rgb(51, 102, 255);"><br />Value 0</span><span style="color: rgb(51, 102, 255);"><br />Name: DeviceInstance</span><span style="color: rgb(51, 102, 255);"><br />Type: REG_SZ</span><span style="color: rgb(51, 102, 255);"><br />Data: STORAGE\RemovableMedia\7&24e36f51&0&RM</span><br /><br />เป็นวันที่ 12 ธันวาคม 2007 เวลา 10.37 น. เหมือนกันครับ ตรงกับอันแรกที่เราได้มา เราสามารถใช้ค่า Last Write Time ของ sub key ทั้งสองอันในการ cross checkได้ครับ<br /></span></span><span style="font-weight: bold; color: rgb(0, 153, 0);"></span>Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-36822296943046996172007-12-11T09:04:00.000+07:002007-12-11T11:30:18.065+07:00จะรู้ได้อย่างไร ว่าเครื่องเราเสียบ USB thumb drive อะไรไปบ้างหลังจากที่พักร้อนยาวไปตามหาหัวใจตัวเอง (น้ำเน่าๆ แหะๆ) วันนี้ก้อได้เวลากลับมาทำงานอีกครั้ง ว่าจะทำเขียนเรื่องเกี่ยวกับ Windows Memory Analysis ต่อ แต่มันตันๆยังไงไม่รู้ ก็เลยเปลี่ยนมาเรื่องเบาๆบ้างดีกว่า โดยเรื่องที่จะเอามายำวันนี้เกี่ยวกับ <span style="font-weight: bold; color: rgb(51, 102, 255);">USB forensics</span> โดยจะเป็นการตรวจสอบว่าเครื่องที่เราสงสัยได้เสียบ USB thumb drive ใดไปบ้าง<br /><br />พระเอกของเราในตอนนี้คือ <span style="font-weight: bold; color: rgb(0, 153, 0);">registry key</span> ครับ (แน่นอน วิธีการนี้ใช้ได้แต่ระบบปฏิบัติการ Windows เท่านั้นแหะๆ) โดย registry key ที่เราสนใจสำหรับการตรวจสอบคือ<br /><br /><span style="font-weight: bold; color: rgb(0, 153, 0);"> HKLM\System\CurrentControlSet\Enum\USBSTOR</span><br /><br />โดยภายใต้ key ดังกล่าวจะเป็นรายชื่อและรุ่นของอุปกรณ์ USB ที่เชื่อมต่อเข้ากับคอมพิวเตอร์ที่ทำการตรวจสอบดังภาพ<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/USBSTOR.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />โดยรูปแบบของชื่ออุปกรณ์เป็นดังข้างล่างนี้<br /><br /><span style="font-weight: bold; color: rgb(204, 0, 0); font-style: italic;">Type</span><span style="font-weight: bold;">&Ven_<span style="color: rgb(204, 102, 0); font-style: italic;">VendorName</span>&Prod_<span style="color: rgb(0, 153, 0); font-style: italic;">ProductName</span>&Rev_<span style="color: rgb(51, 102, 255); font-style: italic;">Revision</span></span><br /><br />โดย <span style="color: rgb(153, 0, 0); font-weight: bold;">Type</span> นั้นเป็นประเภทของอุปกรณ์ ถ้าเป็น USB thumb drive นั้น Type จะเป็น <span style="font-weight: bold; color: rgb(153, 0, 0);">Disk </span>แต่ถ้าเป็น CD-ROM Type จะเป็น <span style="font-weight: bold; color: rgb(153, 0, 0);">CdRom</span><br /><br /><span style="color: rgb(204, 102, 0); font-weight: bold;">VendorName</span> เป็นชื่อของผู้ผลิตของอุปกรณ์ดังกล่าว<br /><br /><span style="color: rgb(0, 153, 0); font-weight: bold;">ProductName</span> เป็นชื่อรุ่นของอุปกรณ์ดังกล่าว<br /><br /><span style="font-weight: bold; color: rgb(51, 102, 255);">Revision</span> เป็นการ revision ของอุปกรณ์ในรุ่นนั้นๆ<br /><br />ดังนั้น <span style="color: rgb(0, 153, 0);">Disk&Ven_Kingston&Prod_DataTraveler_2.0&Rev_1.00</span> จึงสามารถแปลงข้อมูลได้เป็น<br /><br /><span style="color: rgb(0, 153, 0); font-weight: bold;">อุปกรณ์: USB Thumb drive (Disk)</span><br /><span style="color: rgb(0, 153, 0); font-weight: bold;"><br />ผู้ผลิต: Kingston</span><br /><span style="color: rgb(0, 153, 0); font-weight: bold;"><br />รุ่น: Data Traveler 2.0</span><br /><span style="color: rgb(0, 153, 0); font-weight: bold;"><br />Revision: 1.00</span><br /><br />ไม่ยากเลยชิมิ :)<br /><br />แต่ยัง... ยังไม่จบ เพราะว่าตอนนี้เราเพิ่งรู้แค่ว่า USB รุ่นอะไรที่เสียบเข้ามาที่เครื่องคอมพิวเตอร์เท่านั้น แต่เราไม่รู้ว่าเป็น USB อันไหน ซึ่งการที่เราจะสามารถระบุ USB thumb drive แบบเจาะจงลงไปนั้น เราจะต้องใช้หมายเลข serial number ของอุปกรณ์ในการระบุครับ โดยหมายเลข serial number ของอุปกรณ์ USB ที่เสีบเข้าเครื่องนั้นสามารถดูได้จาก sub key ของ registry ของอปุกรณ์ที่เราสนใจดังภาพ<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/USBSTOR2.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />ที่วงไว้ตรงสีแดงคือ serial number ของอุปกรณ์ครับ โดย serial ของ USB thumb drive Kingston Data Traveler ที่เราทำการตรวจสอบไปในตัวอย่างแรกนั้นคือ <span style="color: rgb(0, 153, 0);">135000000000001357924712&0</span> ซึ่ง serial number ดังกล่าวจะไม่มีการซ้ำกับอุปกรณ์ชิ้นอื่นถึงแม้ว่าเป็นรุ่นเดียวกัน (กล่าวคือ USB thumb drive Kingston Data Traveler 2 อันถึงแม้จะเป็นรุ่นเดียวกัน แต่จะมี serial number ที่ต่างกัน) นอกจากนี้ถึงแม้จะนำไปเสียบที่ต่างเครื่องกันก็จะขึ้นเป็นเลขเดียวกันด้วย<br /><br />อีกวิธีการหนึ่งที่สะดวกสำหรับระบุว่าอุปกรณ์ USB นี้มีหมายเลข serial คืออะไรโดยเราโปรแกรมชื่อว่า <span style="color: rgb(0, 153, 0); font-weight: bold;">UVCView</span> ครับ ซึ่งตัวอย่างของการใช้โปรแกรมเป็นดังภาพ<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/USBSTOR3.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />จากภาพตำแหน่งที่วงสีแดงๆคือ serial number ของอุปกรณ์ USB ซึ่งในที่นี้คือ <span style="font-weight: bold; color: rgb(0, 153, 0);">Kingmax USB Flash Disk Rev 2.00</span> นั่นเอง<br /><br />อย่างไรก็ตามก็มีข้อควรระวังสำหรับการตรวจสอบคือ<br /><ol><li>การตรวจสอบนี้อาศัยข้อมูลจาก registry key ซึ่งสามารถเปลี่ยนแปลงและแก้ไขได้ ซึ่งผู้กระทำความผิดอาจแก้ไขข้อมูลตรงจุดดังกล่าวเพื่อทำลายหลักฐานได้</li><li>ถึงแม้อุปกรณ์ USB ส่วนมากจะมี serial number ที่แตกต่างกับในแต่ละชิ้นระบุไว้ ก็ยังมีอีกอุปกรณ์ USB อีกจำนวนมากที่ไม่มี serial number ซึ่งอุปกรณ์ที่ไม่มี serial number นั้น ระบบปฏิบัติการ Windows จะทำการสร้าง serial number ให้เอง ซึ่ง serial number ดังกล่าวไม่สามารถนำไประบุอุปกรณ์ที่ต้องสงสัยได้ ตัวอย่างของ serial number ที่ไม่สามารถนำไปใช้ได้คือ serial ที่มีเครื่องหมาย & อยู่เป็นลำดับที่สอง ยกตัวอย่างเช่น <span style="color: rgb(0, 153, 0);">6&355c3fd8&0</span><br /></li></ol>จบแหละ เด๋วนี้ขี้เกียจหาคำลงท้ายน่ะ แหะๆTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com2tag:blogger.com,1999:blog-229158657034239319.post-26768526569938281462007-11-18T20:54:00.000+07:002007-11-20T11:12:16.706+07:00โครงสร้างข้อมูล (data structure) ของ PEB บน Windows XP SP2ตอนนี้อยู่ระหว่างการพัฒนา <span style="font-weight: bold; color: rgb(51, 51, 255);">lspd</span> ให้สามารถทำงานได้บน<span style="font-weight: bold; color: rgb(255, 0, 0);"> Windows XP SP2</span> (ของเก่าที่เขียนโดย <span style="font-weight: bold; color: rgb(51, 51, 255);">Harlan Carvey</span> ทำงานได้บน Windows 2000 เท่านั้น) ซึ่งจากการไล่โค้ดดูพบว่ามันมีการอ่าน PEB ด้วย เนื่องจาก PEB บน Windows 2000 กับบน Windows XP SP2 น่าจะมีความแตกต่างกันบ้าง...<br /><br />ว่าแล้วก็เปิด Windbg ขึ้นมาแล้วเลือกที่ <span style="font-weight: bold; color: rgb(255, 0, 0);">File -> Kernel Debug ...</span> จากนั้นเลือกที่แถบ <span style="font-weight: bold; color: rgb(255, 0, 0);">Local </span>จากนั้น click ที่ OK เพื่อเป็นการรัน Kernel Debugger แบบ Local (การรัน Kernel Debugger นั้นสามารถทำได้ตั้งแต่ระบบปฏิบัติการ Windows XP SP เท่าไหร่ก็ไม่รู้ขึ้นไป แต่รันบน Windows 2000 ไม่ได้ครับ ต้องใช้<span style="font-weight: bold; color: rgb(51, 51, 255);"> livekd </span>แทน)<br /><br />เมื่อรันได้ผลดังนี้<br /><br /><span style="color: rgb(0, 153, 0);">Microsoft (R) Windows Debugger Version 6.6.0007.5</span><br /><span style="color: rgb(0, 153, 0);">Copyright (c) Microsoft Corporation. All rights reserved.</span><br /><br /><span style="color: rgb(0, 153, 0);">Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE</span><span style="color: rgb(0, 153, 0);"><br />Symbol search path is: C:\WINDOWS\SYSTEM32\ntoskrnl.exe;C:\WINDOWS\Symbols</span><span style="color: rgb(0, 153, 0);"><br />Executable search path is: </span><span style="color: rgb(0, 153, 0);"><br />*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntoskrnl.exe - </span><span style="color: rgb(0, 153, 0);"><br />*******************************************************************************</span><br /><br />(มีต่ออีกแต่ตัดมาแค่นี้) มัน error แฮะ - -" ลองรันคำสั่ง <span style="font-weight: bold; color: rgb(51, 51, 255);">.reload</span> ก้อยังมี error เหมือนเดิม พอรันคำสั่ง <span style="font-weight: bold; color: rgb(51, 51, 255);">dt _PEB</span> เพื่อทดสอบมันก็ฟ้องว่าไม่สามารถ resolve _PEB ได้<br /><br />ไปๆมาลองสังเกตที่ Symbol search path ดูพบว่ามันเป็น <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold;">C:\WINDOWS\SYSTEM32\ntoskrnl.exe;C:\WINDOWS\Symbols</span> </span>แต่ไอ้ที่ตั้งค่าไว้มันมีแค่ C:\WINDOWS\Symbols นี่หน่า... ว่าแล้วก็เลยไปไปดูที่ <span style="font-weight: bold; color: rgb(255, 0, 0);">File --> Symbol Path File...</span> พบว่ามันตั้งค่าเป็น C:\WINDOWS\system32 - -" ไปกันใหญ่เลย ว่าแล้วก็ตั้งค่าเป็น C:\WINDOWS\Symbols ซะแล้วรันคำสั่ง .reload จากนั้นรันคำสั่งเพื่อดูโครงสร้างข้อมูลของ PEB ได้ผลดังข้างล่าง<br /><br /><span style="color: rgb(0, 153, 0);">lkd> dt _PEB<br /> +0x000 InheritedAddressSpace : UChar<br /> +0x001 ReadImageFileExecOptions : UChar<br /> +0x002 BeingDebugged : UChar<br /> +0x003 SpareBool : UChar<br /> +0x004 Mutant : Ptr32 Void<br /> +0x008 ImageBaseAddress : Ptr32 Void<br /> +0x00c Ldr : Ptr32 _PEB_LDR_DATA<br /> +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS<br /> +0x014 SubSystemData : Ptr32 Void<br /> +0x018 ProcessHeap : Ptr32 Void<br /> +0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION<br /> +0x020 FastPebLockRoutine : Ptr32 Void<br /> +0x024 FastPebUnlockRoutine : Ptr32 Void<br /> +0x028 EnvironmentUpdateCount : Uint4B<br /> +0x02c KernelCallbackTable : Ptr32 Void<br /> +0x030 SystemReserved : [1] Uint4B<br /> +0x034 AtlThunkSListPtr32 : Uint4B<br /> +0x038 FreeList : Ptr32 _PEB_FREE_BLOCK<br /> +0x03c TlsExpansionCounter : Uint4B<br /> +0x040 TlsBitmap : Ptr32 Void<br /> +0x044 TlsBitmapBits : [2] Uint4B<br /> +0x04c ReadOnlySharedMemoryBase : Ptr32 Void<br /> +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void<br /> +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void<br /> +0x058 AnsiCodePageData : Ptr32 Void<br /> +0x05c OemCodePageData : Ptr32 Void<br /> +0x060 UnicodeCaseTableData : Ptr32 Void<br /> +0x064 NumberOfProcessors : Uint4B<br /> +0x068 NtGlobalFlag : Uint4B<br /> +0x070 CriticalSectionTimeout : _LARGE_INTEGER<br /> +0x078 HeapSegmentReserve : Uint4B<br /> +0x07c HeapSegmentCommit : Uint4B<br /> +0x080 HeapDeCommitTotalFreeThreshold : Uint4B<br /> +0x084 HeapDeCommitFreeBlockThreshold : Uint4B<br /> +0x088 NumberOfHeaps : Uint4B<br /> +0x08c MaximumNumberOfHeaps : Uint4B<br /> +0x090 ProcessHeaps : Ptr32 Ptr32 Void<br /> +0x094 GdiSharedHandleTable : Ptr32 Void<br /> +0x098 ProcessStarterHelper : Ptr32 Void<br /> +0x09c GdiDCAttributeList : Uint4B<br /> +0x0a0 LoaderLock : Ptr32 Void<br /> +0x0a4 OSMajorVersion : Uint4B<br /> +0x0a8 OSMinorVersion : Uint4B<br /> +0x0ac OSBuildNumber : Uint2B<br /> +0x0ae OSCSDVersion : Uint2B<br /> +0x0b0 OSPlatformId : Uint4B<br /> +0x0b4 ImageSubsystem : Uint4B<br /> +0x0b8 ImageSubsystemMajorVersion : Uint4B<br /> +0x0bc ImageSubsystemMinorVersion : Uint4B<br /> +0x0c0 ImageProcessAffinityMask : Uint4B<br /> +0x0c4 GdiHandleBuffer : [34] Uint4B<br /> +0x14c PostProcessInitRoutine : Ptr32 <br /> +0x150 TlsExpansionBitmap : Ptr32 Void<br /> +0x154 TlsExpansionBitmapBits : [32] Uint4B<br /> +0x1d4 SessionId : Uint4B<br /> +0x1d8 AppCompatFlags : _ULARGE_INTEGER<br /> +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER<br /> +0x1e8 pShimData : Ptr32 Void<br /> +0x1ec AppCompatInfo : Ptr32 Void<br /> +0x1f0 CSDVersion : _UNICODE_STRING<br /> +0x1f8 ActivationContextData : Ptr32 Void<br /> +0x1fc ProcessAssemblyStorageMap : Ptr32 Void<br /> +0x200 SystemDefaultActivationContextData : Ptr32 Void<br /> +0x204 SystemAssemblyStorageMap : Ptr32 Void<br /> +0x208 MinimumStackCommit : Uint4B<br /></span><span style="color: rgb(0, 153, 0);"></span><br />ได้แหล้ว :) จะได้เขียนต่อซะทีTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-19250235796181428942007-11-13T14:42:00.000+07:002007-11-20T11:13:45.643+07:00การเปลี่ยน Virtual Address เป็น Physical Address ของระบบปฏิบัติการ Windowsมีหลายคนถามว่าทำไมช่วงนี้อัพบ่อยจัง เหตุผลก็คือ<span style="font-weight: bold; color: rgb(255, 0, 0);">ช่วงนี้มันว่าง</span>ครับ หลังจากที่ยุ่งวุ่นวายอยู่หลายเดือน มาว่างช่วงปลายปีก็ดีเหมือนกันนะ ชิวดี มีความสุข<br /><br />หลังจากที่ได้เขียน <a href="http://trirat-puttaraksa.blogspot.com/2007/11/lsproc-windows-2003-server-sp0.html">lsproc </a>จนสามารถทำงานกับ Windows 2000, xp และ 2003 ไปแล้วนั้น ก็เลยมีความคิดที่จะเขียนโปรแกรมอันใหม่ให้มันทำอะไรได้มากกว่านั้น เหมือนๆกับ <span style="font-weight: bold; color: rgb(51, 102, 255);">lspd</span> ของ <span style="font-weight: bold; color: rgb(51, 51, 255);"><span style="color: rgb(51, 102, 255);">Harlan Carvey </span></span>(ความจริงคือจะเอา<span style="font-weight: bold; color: rgb(51, 102, 255);"> lspd</span> มาดัดแปลงให้ทำงานกับหลายๆระบบปฏิบัติการได้นั่นแหละ แหะๆ) แต่หลังจากที่ไล่ดูโค้ดแล้วก็รู้สึกว่ามี concept บางอย่างที่จำเป็นที่จะต้องทำความเข้าใจก่อนที่จะลงไปในระดับลึก concept ที่ว่าคือการเปลี่ยน virtual address เป็น physical address นั่นเอง<br /><br />ในการเปลี่ยน virtual address เป็น physical address นั้น สิ่งที่จำเป็นจะต้องทราบมีอยู่ดังต่อไปนี้<br /><br /><ol><li><span style="font-weight: bold; color: rgb(51, 102, 255);">virtual address</span> ที่เราต้องการเปลี่ยนเป็น physical address</li><li><span style="font-weight: bold; color: rgb(51, 102, 255);">Page Directory Base</span> ซึ่งเราสามารถหาได้จากตำแหน่งที่ <span style="font-weight: bold; color: rgb(255, 0, 0);">0x18 </span>จากตำแหน่งเริ่มต้นของ <span style="color: rgb(255, 0, 0); font-weight: bold;">EPROCESS </span>ีซึ่งค่านี้คงที่สำหรับระบบปฏิบัติการ Windows 2000 SP4 จนถึง Windows Vista เลยทีเดียว<br /></li></ol><br />เมื่อทราบค่าทั้ง 2 ค่าแล้ว ขั้นตอนในการเปลี่ยนค่ามีดังต่อไปนี้<br /><br /><ul><li>ทำการแบ่ง virtual address ซึ่งมีขนาด 32 bits ออกเป็นสามส่วนด้วยกันคือ bit 1 - 12 ทำหน้าที่เป็น<span style="font-weight: bold; color: rgb(51, 102, 255);"> byte index</span>, bit ที่ 13 -22 ทำหน้าที่เป็น <span style="font-weight: bold; color: rgb(51, 102, 255);">page table index</span> และ bit ที่ 23 - 32 ทำหน้าที่เป็น <span style="font-weight: bold; color: rgb(51, 102, 255);">page directory index</span></li></ul><span style="font-weight: bold; color: rgb(51, 102, 255);"></span><ul><li>นำค่า <span style="font-weight: bold; color: rgb(51, 102, 255);">page directory base (pdb)</span> และ <span style="font-weight: bold; color: rgb(51, 102, 255);">page directory index (pdi)</span> มาคำนวนหาตำแหน่งของ page table โดยใช้สูตร: <span style="color: rgb(255, 0, 0); font-weight: bold;">pdb + (pdi * 4) = ตำแหน่งของ page table</span> ใน physical memory<br /></li></ul><ul><li>อ่านค่า <span style="font-weight: bold; color: rgb(51, 102, 255);">page table</span> ใน physical memory จากนั้นทำการตรวจสอบ <span style="font-weight: bold; color: rgb(255, 0, 0);">bit ที่ 1 (present bit)</span> ว่าเป็น 1 หรือไม่ การที่ present bit เป็น 1 หมายถึง page นั้นยังอยู่ใน memory</li></ul><ul><li>ทำการคำนวนค่า <span style="font-weight: bold; color: rgb(51, 102, 255);">page table base (ptb)</span> ได้จาก สูตร: <span style="font-weight: bold; color: rgb(255, 0, 0);">ptb = (page table >> 12) * 0x1000</span></li></ul><ul><li>ทำการคำนวนหาค่าตำแหน่งของ <span style="color: rgb(51, 102, 255); font-weight: bold;">page table entry</span> ใน Physical Memory โดยใช้สูตร: <span style="font-weight: bold; color: rgb(255, 0, 0);">ptb + (pti * 4) = ตำแหน่งของ page table entry</span><br /></li></ul><ul><li>อ่านค่า <span style="font-weight: bold; color: rgb(51, 102, 255);">page table entry</span> ใน physical memory จากนั้นทำการตรวจสอบ <span style="font-weight: bold; color: rgb(255, 0, 0);">bit ที่ 1 (present bit)</span> ว่าเป็น 1 หรือไม่ การที่ present bit เป็น 1 หมายถึง page นั้นยังอยู่ใน memory</li></ul><ul><li>ทำการคำนวนค่า <span style="font-weight: bold; color: rgb(51, 102, 255);">page base address (pba)</span> ได้จากสูตร <span style="font-weight: bold; color: rgb(255, 0, 0);">pba = (page table entry >> 12) * 0x1000</span><br /></li></ul><ul><li>ทำการคำนวน <span style="font-weight: bold; color: rgb(51, 102, 255);">physical address</span> ได้จากสูตร <span style="font-weight: bold; color: rgb(255, 0, 0);">pba + byte index</span><br /></li></ul>งงล่ะสิ งงเหมือนกัน แหะๆ ตัวหนังสือพรืดๆอ่านแล้วคงมีน้อยคนที่เข้าใจทันที ดังนั้นตามสไตล์ครับ ปิดท้ายด้วยผังคร่าวๆในการเปลี่ยนจาก virtual address เป็น physical address ครับ ;)<br /><br /><a href="http://photobucket.com" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/VirtualtoPhysical.png" border="0" alt="Photo Sharing and Video Hosting at Photobucket" /></a>Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com1tag:blogger.com,1999:blog-229158657034239319.post-69226726564849997952007-11-12T11:57:00.000+07:002007-11-20T11:13:45.644+07:00lsproc สำหรับระบบปฏิบัติการ Windows 2003 Server SP0ว่างๆเสาร์อาทิตย์ก็เลยไปนั่งเขียน <span style="font-weight: bold; color: rgb(51, 102, 255);">lsproc</span> สำหรับระบบปฏิบัติการ <span style="font-weight: bold; color: rgb(255, 0, 0);">Windows 2003 Server SP0</span> มา เสร็จแล้ววันนี้ก็เลยเอามาทดสอบเลย ผลที่ได้เป็นดังภาพ<br /><br /><a href="http://photobucket.com" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/image-2k3.png" border="0" alt="Photo Sharing and Video Hosting at Photobucket" /></a><br /><br />ใช้ได้ๆ เด๋วต่อไปจะเอา lsproc ทั้ง 3 เวอร์ชั่นมารวมกัน แล้วจะใส่ <span style="font-weight: bold; color: rgb(0, 153, 0);">automatic operating system detection</span> เข้าไปด้วยครับ :)Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-79539411250646422022007-11-09T13:50:00.000+07:002007-11-20T11:13:45.644+07:00การเก็บ physical memory image ด้วย dd และ netcat (#2)เมื่อคราวก่อนนู้น ผมได้กล่าวถึง<a href="http://trirat-puttaraksa.blogspot.com/2007/11/ram-computer-forensics.html">การทำ image ของ physical memory </a>โดยใช้ <span style="font-weight: bold; color: rgb(51, 102, 255);">Helix Live CD</span> ไปแล้ว ซึ่งในตอนนั้นใช้วิธีการย้าย image ไปไว้ที่ share ของเครื่องอื่น วิธีการนี้นั้นจะทำให้เครื่่องคอมพิวเตอร์ที่ทำการตรวจสอบมี connection เพิ่มขึ้นมาอีกอันหนึ่ง ดังนั้นผู้ที่ทำการตรวจสอบจะต้องทำการบันทึกผลกระทบนี้ลงไปในรายงานด้วย<br /><br />การใช้ Helix มีข้อดีคือสะดวก ไม่ต้องพิมพ์คำสั่งที่ซับซ้อน แต่ข้อเสียคือการใช้งาน Helix นั้นจะทำให้ <span style="font-weight: bold; color: rgb(255, 0, 0);">helix.exe</span> ถูกโหลดเข้าไปในหน่วยความจำด้วย (นอกเหนือจากโปรเซสที่จำเป็นเช่น dd) ซึ่งอาจจะไปทับข้อมูลของโปรเซสที่จบการทำงานไปแล้ว แต่มีความสำคัญก็เป็นได้ (helix.exe เป็น GUI ดังนั้นพื้นที่ในการใช้งานในหน่วยความจำย่อมมีขนาดใหญ่กว่าโปรแกรมแบบ command line ธรรมดา)<br /><br />ดังนั้นวันนี้ก็เลยจะนำเสนออีกวิธีการหนึ่งในการทำ physical memory image และย้ายไปไว้ในเครื่องอื่นโดยอัตโนมัติโดยใช้ <span style="color: rgb(51, 102, 255); font-weight: bold;">dd และ netcat</span> เพียงแค่สองโปรแกรมเท่านั้น วิธีการนี้ทำให้เราไม่ต้องโหลด helix.exe เข้าสู้หน่วยความจำ และไม่ต้องสร้าง connection สำหรับนำไฟล์ไปไว้ใน share เครื่องอื่น แต่จะสร้าง connection ระหว่าง netcat ของเครื่องที่เราต้องการเก็บ image กับเครื่องปลายทาง<br /><br />ในขั้นตอนแรก ให้เรารันคำสั่งต่อไปนี้บนเครื่องที่จะย้ายไฟล์ image มาเก็บไว้<br /><span style="font-weight: bold; color: rgb(0, 153, 0);">nc.exe -l -p 8000 | dd.exe of=image-xpsp2.dd</span><br /><br />คำสั่งดังกล่าวเป็นการบอกให้เครื่องคอมพิวเตอร์ที่เราต้องการย้ายไฟล์มาเปิด port หมายเลข 8000 เพื่อรอรับ connection เมื่อมี connection เข้ามาจะทำการส่งต่อข้อมูลไปยังโปรแกรม dd เพื่อทำการเขียนไฟล์ image-xpsp2.dd ซึ่งเป็นไฟล์ image ที่เราต้องการ<br /><br />ในขั้นต่อมา ให้เรารันคำสั่้งต่อไปนี้บนเครื่องที่เราต้องการทำ physical memory image<br /><br /><span style="font-weight: bold; color: rgb(0, 153, 0);">dd.exe if=\\.\PhysicalMemory bs=4096 conv=noerror | nc.exe <span style="font-style: italic;">remote-address</span> 8000</span><br /><br />คำสั่งดังกล่าวเป็นการรัน dd เพื่อเก็บ image จากเครื่องที่เราต้องการตรวจสอบ จากนั้น netcat จะทำการส่งต่อข้อมูลไปยังเครื่อง remote-address ที่ port หมายเลข 8000 อีกทีหนึ่ง<br /><br />หลังจากที่ได้ image มาแล้วก็ลองมาทำการทดสอบว่า <a href="http://trirat-puttaraksa.blogspot.com/2007/11/lsproc-windows-xp-sp2.html">lsproc-xpsp2</a> ที่เขียนขึ้นมาสามารถ parsing เพื่อเรียกดูข้อมูลได้หรือไม่<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/image-xpsp2-2.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />lsproc-xpsp2 ก็ยังสามารถอ่าน image ที่เก็บด้วยวิธีการนี้เช่นกัน :)Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-44681124328575187672007-11-08T15:06:00.000+07:002007-11-20T11:13:45.644+07:00lsproc สำหรับระบบปฏิบัติการ Windows XP SP2หลังจากที่<a href="http://trirat-puttaraksa.blogspot.com/2007/11/ram.html">วันก่อน</a>ได้ใช้ <span style="font-weight: bold; color: rgb(51, 102, 255);">lsproc</span> ทำการอ่านข้อมูลของ physical memory image ของระบบปฏิบัติการ Windows 2000 Server SP4 ไปแล้ว ในวันนี้เราจะมาดู physical memory image ของระบบปฏิบัติการ <span style="font-weight: bold; color: rgb(255, 0, 0);">Windows XP SP2</span> กัน<br /><br />ดังที่ทราบกันดีว่า lsproc ซึ่งพัฒนาขึ้นโดย <span style="font-weight: bold; color: rgb(51, 51, 255);"><span style="color: rgb(51, 102, 255);">Harlan Carvey </span></span>นั้นสามารถอ่าน image ของระบบปฏิบัติการ Windows 2000 SP4 เท่านั้น (เนื่องจากมันเป็น PoC ซึ่งคาดว่าขี้เกียจเขียนให้มัน support image ที่ได้จากระบบปฏิบัติการรุ่นอื่นๆ ให้รู้ว่ามันทำได้เป็นพอ) ดังนั้นด้วยความที่ช่วงนี้ว่างงาน จึงได้หยิบเอาเจ้า lsproc มาทำการตัดแปลงใหม่ให้สามารถอ่าน physical memory image ของ Windows XP SP2 ได้โดยตั้งชื่อเป็น <span style="font-weight: bold; color: rgb(51, 102, 255);">lsproc-xpsp2 </span><br /><br />ผลที่ได้จากการอ่าน physical memory image ของระบบปฏิิบัติการ Windows XP SP2 ด้วย lsproc-xpsp2 เป็นดังภาพข้างล่าง<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/image-xpsp2.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />:) ดูดีทีเดียวแหละ จากการทดสอบหลายๆครั้งพบว่ายังไม่มีข้อผิดพลาดขึ้นในการทำงาน ซึ่งเด๋วจะให้ชาวบ้านช่วยทดสอบอีกทีหนึ่ง<br /><br />วกกลับมาดูที่ผลลัพธ์กันนิดนึง สังเกตว่าจะเห็นโปรเซสของ <span style="font-weight: bold; color: rgb(255, 0, 0);">dd.exe</span> ซึ่งมีเครื่องหมาย <span style="font-weight: bold; color: rgb(255, 0, 0);">(x)</span> อยู่ประมาณ 3 - 4 โปรเซส (เป็นโปรเซสที่จบการทำงานไปแล้ว) ซึ่งสาเหตุเนื่องมาจากผมพิมพ์ syntax ผิดตอนเก็บ image ครับ - -" เลยทำให้ content ของ physical memory image นี่มีโปรเซสของ dd.exe ปนอยู่กระจายเต็มไปหมด<br /><br />หลังจากที่ดูประสิทธิภาพการทำงานของ lsproc-xpsp2 ไปแล้ว เรามาดูกันสักหน่อยดีกว่าว่า lsproc-xpsp2 มีอะไรแตกต่างกับ lsproc จึงสามารถอ่าน physical memory image ของ Windows XP SP2 ได้ (ลืมบอกไปว่า lsproc-xpsp2 อ่าน image ของ Windows 2000 SP4 ไม่ได้นะครับ แหะๆ แต่ในอนาคตจะ merge รวมกับ lsproc แต่คงต้องขออนุญาตเจ้าของก่อน)<br /><br />lsproc-xpsp2 แตกต่างจาก lsproc ดังนี้<br /><ul><li>offset ของข้อมูลต่างๆในโครงสร้างข้อมูล <span style="font-weight: bold; color: rgb(51, 102, 255);">EPROCESS</span> และ <span style="font-weight: bold; color: rgb(51, 102, 255);">ETHREAD</span> ซึ่งสามารถดูข้อมูลสรุปได้จาก <a href="http://computer.forensikblog.de/en/2006/03/adapting_ptfinder_to_other_versions.html">blog ของ Andreas Schuster</a> ซึ่งเป็นหนึ่งในบุคคลแรกๆที่ทำเกี่ยวกับเรื่อง memory analysis และเป็นคนเขียนโปรแกรม PTFinder ครับซึ่งเป็นโปรแกรมทำงานใกล้เคียงกับ lsproc ครับ<br /></li><li>โครงสร้างข้อมูลของ EPROCESS และ ETHREAD ของ Windows 2000 SP4 และ Windows XP SP2 มีการเปลี่ยนแปลงในบางส่วนครับ (เอ๊ะ สองข้อนี้มันเขียนรวมกันได้นี่หว่า - -" แหะๆ)<br /></li></ul>จบแหล้ว ห้วนๆนี่แหละTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-43964479432850555822007-11-06T14:14:00.000+07:002007-11-20T11:13:45.645+07:00การอ่านข้อมูล image ของ physical memory (RAM) เพื่อทำการค้นหาว่า ณ เวลาที่เก็บข้อมูลมีโปรเซสใดรันอยู่บ้างหลังจากที่ได้กล่าวถึงการ dump ข้อมูลจาก Physical Memory มาใน<a href="http://trirat-puttaraksa.blogspot.com/2007/11/ram-computer-forensics.html">คราวที่แล้ว</a> วันนี้จะกล่าวถึงเรื่องการนำข้อมูลของ RAM ที่ได้มาไปทำการวิเคราะห์ โดยจะดูว่า ณ เวลาที่ทำการเก็บข้อมูลนั้นมีโปรเซสใดรันอยู่บ้าง<br /><br />หมายเหตุ: ซอฟต์แวร์และวิธีการที่ใช้วิเคราะห์ที่จะกล่าวต่อไปนี้นั้น สามารถวิเคราะห์ <span style="font-weight: bold; color: rgb(255, 0, 0);">RAM ที่ได้จากระบบปฎิบัติการ Windows เท่านั้น</span> ไม่สามารถวิเคราะห์ข้อมูล RAM ของระบบปฏิบัติการ Linux ได้ เนื่องจากโครงสร้างในการเก็บข้อมูลนั้นต่างกัน<br /><br />แล้วเราจะวิเคราะห์ยังไง ?? ก่อนที่จะไปดูวิธีการ เราจะไปดูกันก่อนว่ามีโปรแกรมใดบ้างที่ช่วยในการวิเคราะห์...<br /><br />โปรแกรมที่ช่วยในการวิเคราะห์นี้มีชื่อว่า <span style="font-weight: bold; color: rgb(51, 102, 255);">lsproc</span><span style="color: rgb(51, 51, 255);"> </span>ซึ่งเขียนโดย <span style="font-weight: bold; color: rgb(51, 51, 255);"><span style="color: rgb(51, 102, 255);">Harlan Carvey</span> </span>โดย lsproc นั้นจะทำการอ่าน image ที่เราได้จาก RAM แล้วทำการค้นหาโครงสร้างข้อมูลต่างๆ (data structure) และทำการแสดงข้อมูลออกมาเป็นดังภาพข้างล่าง<br /><br />หมายเหตุ: ข้อมูลจาก RAM ที่นำมาวิเคราะห์นี้ได้จากระบบปฏิบัติการ Windows 2000 Server SP4<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/list-process.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />จากภาพ lsproc จะทำการแสดง หมายเลขโปรเซส (PID), หมายเลขโปรเซสที่ทำให้เกิดโปรเซสนั้น (PPID) ชื่อของโปรเซส, ตำแหน่งที่อยู่ใน Physical memory (offset) และเวลาที่โปรเซสถูกสร้างขึ้น สังเกตว่าผลลัพธ์ที่ได้มานั้นมีโปรเซสของ <span style="font-weight: bold; color: rgb(51, 102, 255);">dd (PID หมายเลข 216)</span> และโปรเซสของ<span style="font-weight: bold; color: rgb(51, 51, 255);"> <span style="color: rgb(51, 102, 255);">helix (PID</span> <span style="color: rgb(51, 102, 255);">หมายเลข 404)</span> </span>ที่เราใช้ในการเก็บข้อมูลของ physical memory รวมอยู่ด้วย นอกจากนี้ lsproc ยังสามารถดึงรายชื่อของโปรเซสที่จบการทำงานไปแล้วขึ้นมาแสดงได้ หากข้อมูลของโปรเซสดังกล่าวที่อยู่ใน RAM ยังไม่ถูกเขียนทับโดยโปรเซสอื่นๆ โปรเซสที่จบการทำงานไปแล้วนั้นข้างหลังชื่อของโปรเซสจะมีเครื่องหมาย (x) อยู่ ซึ่งในที่นี้ก็คือ <span style="font-weight: bold; color: rgb(51, 102, 255);">userinit.exe (PID หมายเลข 1048)</span> และ <span style="color: rgb(0, 0, 0);"><span style="font-weight: bold; color: rgb(51, 102, 255);">winmgmt.exe (PID หมายเลข 1052) </span><br /><br /></span>หลังจากที่รู้จักโปรแกรมช่วยกันไปแล้ว คราวนี้เราจะมาดูกันว่า lsproc ทำงานกันอย่างไร<br /><br />lsproc ทำงานโดยทำการอ่าน image ที่ได้จาก RAM แล้วทำการค้นหาโครงสร้างข้อมูลที่เรียกว่า <span style="font-weight: bold; color: rgb(51, 102, 255);">EPROCESS</span> ซึ่งเป็นโครงสร้างข้อมูลที่ระบบปฏิบัติการ Windows ไว้ใช้สำหรับทำการเก็บข้อมูลของโปรเซสต่างๆที่เกิดขึ้นบนระบบ โดยโครงสร้างข้อมูล EPROCESS ของระบบปฏิบัติการ Windows 2000 Server SP4 นั้นสามารถดูได้จาก <a href="http://computer.forensikblog.de/en/2005/10/eprocess_5_0_2195_7045.html">Forensik Blog</a> (เค้าเขียนว่า Forensik จริงๆ ไม่มีเขียนผิดนะ แหะๆ)<br /><br />ในโครงสร้างข้อมูล EPROCESS นั้น ได้เก็บโครงสร้างข้อมูลที่น่าในใจอย่างหนึ่งคือ <span style="font-weight: bold; color: rgb(51, 102, 255);">DISPATCHER_HEADER</span> ซึ่งโครงสร้างข้อมูลดังกล่าวมีลักษณะดังต่อไปนี<pre> <span style="color: rgb(0, 153, 0);">+0x000 Header : struct _DISPATCHER_HEADER, 6 elements, 0x10 bytes</span><br /><span style="color: rgb(0, 153, 0);"> <span style="font-weight: bold;"> +0x000 Type : UChar</span></span><br /><span style="color: rgb(0, 153, 0);"> +0x001 Absolute : UChar</span><br /><span style="color: rgb(0, 153, 0);"> <span style="font-weight: bold;"> +0x002 Size : UChar</span></span><br /><span style="color: rgb(0, 153, 0);"> +0x003 Inserted : UChar</span><br /><span style="color: rgb(0, 153, 0);"> +0x004 SignalState : Int4B</span><br /><span style="color: rgb(0, 153, 0);"> +0x008 WaitListHead : struct _LIST_ENTRY, 2 elements, 0x8 bytes</span><br /><span style="color: rgb(0, 153, 0);"> +0x000 Flink : Ptr32 to </span><br /><span style="color: rgb(0, 153, 0);"> +0x004 Blink : Ptr32 to </span></pre>ชนิดของข้อมูลที่ทำตัวหนานั้นคือ <span style="font-weight: bold; color: rgb(51, 102, 255);">Type </span>และ <span style="font-weight: bold; color: rgb(51, 102, 255);">Size</span> ซึ่งจากข้อมูลของ <a href="http://computer.forensikblog.de/en/2005/10/eprocess_5_0_2195_7045.html">Forensik Blog</a> ได้บอกไว้ว่าค่า Type จะเป็น <span style="font-weight: bold; color: rgb(0, 153, 0);">0x03 </span>และ Size จะเป็น <span style="font-weight: bold; color: rgb(0, 153, 0);">0x1b</span> เสมอ ซึ่งค่านี้จะคงที่ตั้งแต่ Windows 2000 Server SP4 ไปจนถึง Windows 2003 Server ดังนั้นเราสามารถใช้ค่านี้ทำการระบุตำแหน่งของข้อมูลที่เกี่ยวข้องกับโปรเซสใน physical memory ได้<br /><br />เมื่อทำการระบุตำแหน่งของข้อมูลที่เกี่ยวข้องกับโปรเซสได้แล้ว จากนั้นเราทำการอ่านข้อมูลทั้งหมดที่เกี่ยวข้องกับโปรเซสนั้นๆ โดยจำนวนข้อมูลที่อ่านจะขึ้นอยู่กับขนาดของ EPROCESS ของแต่ละระบบปฏิบัติการ โดยระบบปฏิบัติการ Windows 2000 Server SP4 นั้นจะมีขนาด <span style="font-weight: bold; color: rgb(255, 0, 0);">0x290 bytes </span><br /><br />เมื่ออ่านข้อมูลจำนวน 0x290 bytes ของ EPROCESS แล้ว เราจะทำการตรวจสอบอีกขั้นหนึ่งว่าข้อมูลที่เราอ่านมานั้นเป็น EPROCESS จริงๆหรือไม่ ซึ่งขั้นตอนที่ lsproc ทำการตรวจสอบนั้นคือทำการตรวจสอบค่าของ <span style="font-weight: bold; color: rgb(51, 102, 255);">Synchronization Event #2 และ #3</span> ของ EPROCESS ซึ่งทั้ง 2 ค่านี้จะอยู่ที่ตำแหน่ง <span style="font-weight: bold; color: rgb(0, 153, 0);">0x13c</span> และ <span style="font-weight: bold; color: rgb(0, 153, 0);">0x164</span> จากตำแหน่งเริ่มต้นของ EPROCESS ซึ่งหากค่าของ Synchronization ทั้งสองเป็น <span style="font-weight: bold; color: rgb(255, 0, 0);">0x040001</span> แล้ว แสดงว่าข้อมูลจำนวน 0x290 bytes ที่อ่านมานั้นเป็น EPROCESS<br /><br />หลังจากที่มั่นใจว่าข้อมูลที่อ่านมาจำนวน 0x290 bytes นั้นเป็น EPROCESS แล้ว lsproc จึงทำการอ่านข้อมูล ณ ตำแหน่งต่างๆ เช่น ชื่อของโปรเซส (<span style="font-weight: bold; color: rgb(51, 102, 255);">0x1fc</span>), เวลาที่โปรเซสถูกสร้างขึ้น (<span style="font-weight: bold; color: rgb(51, 102, 255);">0x088</span>), PID (<span style="font-weight: bold; color: rgb(51, 102, 255);">0x09c</span>), PPID (<span style="font-weight: bold; color: rgb(51, 102, 255);">0x1c8</span>) แล้วจึงนำมาแสดงผลต่อไป<br /><br />ปิดท้ายกันด้วยขั้นตอนการทำงานแบบหยาบๆของ lsproc ครับ :)<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/lsproc.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a>Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-11937446242072669512007-11-05T11:57:00.000+07:002007-11-20T11:13:45.646+07:00การเก็บข้อมูลที่อยู่ใน RAM สำหรับการทำ Computer Forensicsขึ้นชื่อว่า <span style="color: rgb(51, 102, 255); font-weight: bold;">Live Response</span> (การวิเคราะห์ข้อมูลเกี่ยวกับการบุกรุกโดยอาศัยข้อมูลและสถานะปัจจุบันของเครื่องที่ถูกบุกรุกเป็นหลัก) ก็คงจะปฏิเสธไม่ได้ว่าข้อมูลที่อยู่ใน <span style="color: rgb(51, 102, 255); font-weight: bold;">RAM</span> นั้นมีความสำคัญอย่างยิ่งยวดสำหรับการวิเคราะห์ เนืองจากข้อมูลดังกล่าวเป็นจะเป็นสิ่งที่ช่วยให้เห็นภาพมากขึ้น ณ ขณะที่เครื่องที่ถูกบุกรุกมีโปรเซสใดรันอยู่บ้าง ดังนั้นในวันนี้ผมจะมากล่าวถึงวิธีการเก็บข้อมูลที่อยู่ใน RAM ว่าสามารถทำได้อย่างไร<br /><br />วิธีการที่ง่ายที่สุดคือใช้ <span style="font-weight: bold; color: rgb(51, 102, 255);">Helix Live CD</span> ซึ่งมี GUI ให้ใช้แบบง่ายๆเลย หน้าตาของ Helix ก็เป็นดังภาพข้างล่าง<br /><br /><a href="http://photobucket.com" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/dd-01.png" border="0" alt="Photo Sharing and Video Hosting at Photobucket" /></a><br /><br />โดยปกติแล้วเราจะใช้ dd เพื่อทำการสร้าง image ของฮาร์ดดิสก์แต่อย่างไรก็ตาม dd สามารถทำการ "dump" ข้อมูลจาก Physical memory หรือ RAM ได้อีกด้วย จากภาพข้างบนเป็นการดึงข้อมูลจาก RAM บนระบบปฏิบัติการ Windows ซึ่งหากต้องการรันแบบ command line นั้นสามารถรันได้โดยใช้คำสั่ง<br /><br /><span style="font-weight: bold; color: rgb(0, 153, 0);">dd if=\\.\PhysicalMemory of=ram.img bs=4096 conv=noerror</span><br /><br />if ย่อมาจาก input file ซึ่งหมายถึงว่าให้ dd ทำการอ่านข้อมูลจากอะไร หากเป็น RAM บนระบบปฏิบัติการ Windows เราจะใช้ <span style="font-weight: bold; color: rgb(51, 102, 255);">\\.\PhysicalMemory</span> ในขณะที่บนระบบปฏิบัติการ Linux นั้นจะเป็น <span style="font-weight: bold; color: rgb(51, 102, 255);">/dev/mem </span><br /><br />หมายเหตุ: <span style="color: rgb(0, 0, 0);">\\.\PhysicalMemory</span> สามารถใช้ได้ตั้งแต่ Windows 2000 จนถึง Windows 2003 Server SP0 แต่ <span style="font-weight: bold; color: rgb(255, 0, 0);">Windows 2003 Server SP1 จนถึง Vista</span> จะไม่สามารถใช้ dd อ่านได้เนื่องจากระบบปฏิบัติการรุ่นใหม่ไม่ยอมให้ dd ซึ่งเป็นโปรแกรมในระดับ user-mode สามารถเข้าถึง \\.\PhysicalMemory ได้ จะยอมให้เฉพาะระดับ kernel-mode เท่านั้นเช่น device-driver ที่สามารถเข้าถึงได้ แต่อย่างไรก็ตามผมได้พบว่าเค้าให้ไปอ่านที่ <span style="font-weight: bold; color: rgb(255, 0, 0);">\\.\DebugMemory</span> ซึ่งไว้จะตรวจสอบความถูกต้องอีกทีครับ<br /><br />of ย่อมาจาก output file ซึ่งหมายถึงว่าให้ dd ทำการเขียนข้อมูลไปที่ใด ในที่นี้คือเขียนผลลัพธ์ไปที่ไฟล์ <span style="font-weight: bold; color: rgb(51, 102, 255);">ram.img</span> แต่อย่างไรก็ตามไม่แนะนำให้เขียนข้อมูลลงในในเครื่องที่ทำการตรวจสอบ เพราะอาจจะไปเขียนทับข้อมูลสำคัญที่ถูกลบไปแล้วในฮาร์ดดิสก์ได้ ซึ่งทางเลือกก็คือ<br /><ul><li>เขียนข้อมูลลงไปใน external storage เช่น USB thumb drive หรือไม่ก็ external harddisk</li><li>เขียนข้อมูลลงไปใน share ของคอมพิวเตอร์อีกเครื่องหนึ่ง<br /></li></ul>วิธีการแรกเป็นที่นิยมมากกว่าเนื่องจากระบบที่ทำการเก็บข้อมูลนั้นไม่ต้องเชื่อมต่อออกไปยังภายนอก ซึ่งส่งผลกระทบต่อสภาพแวดล้อมของระบบน้อยกว่าวิธีการที่สอง<br /><br />bs ย่อมาจาก byte sector (ถ้าจำไม่ผิด) เป็นการบอกให้ dd ทำการอ่านและเขียนข้อมูลทีล่ะ <span style="font-weight: bold; color: rgb(51, 102, 255);">4096 byte</span><br /><br /><span style="font-weight: bold; color: rgb(51, 102, 255);">conv=noerror</span> อันนี้ไม่รู้จะอธิบายยังไงดี สรุปใจความสั้นๆคือในกรณีที่ dd ทำการอ่านข้อมูลแล้วเกิดข้อผิดพลาดขึ้น ให้ dd ทำการอ่านข้อมูลต่อไปโดยที่ไม่ต้องหยุดการทำงาน<br /><br />หลังจากทำการดึงข้อมูลจาก RAM ออกมาแ้ล้ว ควรทำการ hash ไฟล์ข้อมูลจาก RAM ทุกครั้งด้วย md5 หรือ SHA-1 ตามแต่สะดวก ในกรณีถ้าใช้ Helix มันจะทำการ hash ให้โดยอัตโนมัติครับTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-55571094710255210482007-10-29T23:48:00.000+07:002007-10-29T23:48:38.001+07:00SANS GIAC Certified Incident Handler (GCIH)กลับมาอีกครั้งหลับจากห่างนานไปนานร่วม 2 -3 เดือน แหะๆ ที่หายไปไม่ใช่แอบไปจีบสาวที่ไหน แต่อ่านหนังสือสอบ certification ตัวนึงคือ <span style="font-weight: bold; color: rgb(51, 102, 255);">GIAC GCIH</span> นั่นเอง ซึ่งก็สามารถสอบผ่านได้ด้วยคะแนน 99 กับ 88 ตามลำดับ วันนี้ก็เลยจะมาโม้เรื่องเจ้า certification ตัวนี้สักหน่อยว่าคืออะไร<br /><br />GIAC GCIH หรือ <span style="color: rgb(51, 102, 255); font-weight: bold;">GIAC Certified Incident Handler</span> เป็น certification ที่ออกมาเพื่อรับรองผู้ที่มีความสามารถในการทำ incident response (การรับมือกับเหตุการณ์บุกรุกระบบเครือข่ายคอมพิวเตอร์) ซึ่งในปัจจุบันนั้นเท่าที่รู้ GCIH ที่มีอยู่<span style="color: rgb(0, 0, 0);">ประเทศไทยนั้นมีอยู่คนเดียว</span> คือ ผมเอง :) (<span style="color: rgb(255, 0, 0); font-weight: bold;">แก้ไขครับ</span> พอดีไปค้นเจอมา ไม่ใช่คนแรกแล้วครับ อดเลย แหะๆ มีคนสอบได้ก่อนผมครับชื่อ Sekpon Juntapremjitt<span style="font-size: 8.5pt; font-family: Arial; color: black;"></span> ครับ) แต่ถ้าหากนับ GIAC สาขาอื่นเข้าไปด้วยนั้น ในประเทศไทยจะมีอยู่ 5 คนคือ<br /><br /><ul><li>ปริญญา หอมเอกนก (GCFW - เกี่ยวกับไฟร์วอลล์)</li><li>เรืองไกร รังสิพล (GCIA - เกี่ยวกับการวิเคราะห์การบุกรุก)</li><li>วิริยะ อุปัติศฤงค์ (GCIA - เกี่ยวกับการวิเคราะห์หารบุกรุก)</li><li>Sekpon Juntapremjitt (GCIH)<span style="font-size: 8.5pt; font-family: Arial; color: black;"></span></li><li>ผมเอง (GCIH)</li></ul><br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/GCIHSilverhi.jpg" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />Certification ของ GIAC นั้นจะมีอายุอยู่ได้ 4 ปี หลังจากนั้นจะต้องสอบใหม่ หากคนที่เคยได้ certification ของ GIAC ไม่ยอมทำการต่ออายุ status ของคนที่ถือใบ certification ตัวนี้จะขึ้นว่า <span style="color: rgb(255, 0, 0); font-weight: bold;">Expired</span> ครับ ดังนั้นถ้าเจอใครที่อ้างว่าเป็น GIAC หรือเห็นหน้าเก่าๆที่บอกว่าเป็น GIAC แล้วไม่แน่ใจว่ายังหมดอายุแล้วหรือยังสามารถตรวจสอบได้ที่ <a href="http://www2.giac.org/certified_professionals/">http://www2.giac.org/certified_professionals/</a> ครับ เข้าไปตามสาขาแล้วทำการ search ด้วยชื่อได้เลยครับ <span style="font-weight: bold; color: rgb(255, 0, 0);">"อย่าให้ใครมาหลอกคุณ"</span><br /><br />อ๊ะ.... ลืมบอกไป ชื่อของผมยังไม่ขึ้นครับเพราะเพิ่งสอบเสร็จไปเมื่อวาน (29 ตุลาคม 2550) แหะ<br /><br />สำหรับเนื้อหาที่สอบสำหรับ GCIH ก็ตามนี้เลยครับ <a href="http://www2.giac.org/certbulletin/gcih.php">http://www2.giac.org/certbulletin/gcih.php</a><br />อ่านมันเข้าไป ถ้าแน่ใจว่าความรู้แน่นพอก็อ่านเองเลยครับ เพราะผมก็อ่านเองแล้วไปสอบเหมือนกัน เพราะว่าค่าติวของที่นี่แพงมากครับ <span style="color: rgb(153, 153, 0); font-weight: bold;">2000$ </span>กว่าเหรียญ ตกแล้วก็แสนกว่าบาทครับ ยังไม่รวมค่าสอบอีก <span style="color: rgb(153, 153, 0); font-weight: bold;">399$</span> ส่วนผมเลือกวิธีการสอบแบบ challenge ครับ จะเสียค่าสอบ <span style="color: rgb(153, 153, 0); font-weight: bold;">899$</span> เหรียญโดยจะแถมตัวอย่างข้อสอบมาให้สองชุดครับ ก็ทำกันเข้าไป แต่ว่าไม่ว่าจะสอบแบบธรรมดาหรือสอบแบบ challenge จะมีกฏหนึ่งที่เหมือนกันคือ<span style="font-weight: bold; color: rgb(204, 153, 51);">ต้องสอบให้เสร็จภายใน 4 เดือนนับตั้งแต่สมัครครับ</span> สนามสอบก็สบายๆ เป็นการสอบแบบ online ครับ ที่ไหนก็ได้ขอเพียงมี internet ที่ไม่หลุดบ่อยๆก็พอ แต่ว่าตั้งแต่วันที่ 1 ธันวาคม 2550 เป็นต้นไปจะมีการเปลี่ยนแปลงกฏครับ คือจะต้องไปสอบตามสนามสอบที่ระบุไว้ ซึ่งในปัจจุบันยังไม่มีสนามสอบในเมืองไทย... แต่จากการสอบถามคาดว่าน่าจะมีในอนาคตอันใกล้ครับ<br /><br />การสอบนั้นจะแบ่งออกเป็นสอบ 2 ครั้ง แต่ละครั้งมี <span style="color: rgb(204, 102, 0); font-weight: bold;">75 ข้อ/เวลา 2 ชั่วโมง </span>เนื้อหาคนละส่วนกัน ต้องทำคะแนนให้ได้มากกว่า 70% ขึ้นไปทั้ง 2 ครั้งถึงจะผ่าน ตอนผมสอบนี่ part 1 นี่ค่อยข้างง่ายครับ แต่เจอ part 2 นี่ค่อนข้างเขี้ยวพอตัวเลย โชคไม่ดีเจอ random ข้อยากๆมาก แต้มเลย drop อย่างที่เห็น<br /><br />เมื่อสอบแบบ choice เสร็จแล้ว ถ้าผ่านได้ certification แบบ <span style="color: rgb(0, 153, 0); font-weight: bold;">Silver</span> ครับ ซึ่งถือเป็นระดับต่ำ (ผมก็อยู่ในระดับ Silver ครับ) ถ้าใครอยากอัพเกรดตัวเองก็สามารถทำได้โดย <span style="color: rgb(0, 153, 0); font-weight: bold;">การสอบ paper</span> ครับแล้วจะได้เลื่อนขั้นเป็นระดับ <span style="color: rgb(0, 153, 0); font-weight: bold;">Gold</span> (ผมวางแผนไว้ว่าจะสอบ Gold ในปีหน้าครับ)<br /><br />โม้เสร็จแล้ว ไปก่อนล่ะ ครั้งหน้าคงเป็นอะไรที่มีสาระมากขึ้นครับ แหะๆTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-43539507977590028522007-08-03T12:07:00.000+07:002007-11-20T11:13:45.646+07:00หมดยุคของ vmware สำหรับการวิเคราะห์ malwareหากกล่าวถึง <span style="font-weight: bold; color: rgb(51, 51, 255);">vmware</span> หลายๆคนก็คงเคยเล่นกัน โดยเฉพาะพวกที่ชอบเล่นกับ <span style="font-weight: bold; color: rgb(204, 0, 0);">malware</span> หรือไม่ก็ <span style="color: rgb(204, 0, 0); font-weight: bold;">exploit</span> เพราะเนื่องจากเจ้า vmware นี่แหละ ที่ช่วยให้เราสามารถรันระบบปฏิบัติการหลายๆระบบ พร้อมกันไปในเครื่องคอมพิวเตอร์เพียงเครื่องเดียว ทำให้เราไม่ต้องหาเครื่องคอมพิวเตอร์อีกเครื่องเพื่อสร้างขึ้นมาเป็น test-based แต่ใช้เครื่องของเราเนี่ยแหละทำเป็น test-based ได้ไปในตัวได้เลย :)<br /><br />ด้วยเหตุนี้ vmware จึงเหมาะสำหรับนำมาวิเคราะห์ malware เพราะการวิเคราะห์ malware นั้น นอกจากจะต้องวิเคราะห์แบบ static คือการวิเคราะห์โค้ดที่เขียนขึ้น (ผ่านทาง reverse engineering) ยังต้องวิเคราะห์แบบ dynamic คือการวิเคราะห์การทำงานจริง โดย vmware มักถูกนำมาใช้สำหรับการวิเคราะห์แบบ dynamic กล่าวคือทำการรันบน malware บนระบบปฏิบัติการที่สร้างขึ้นจาก vmware แล้วดูลักษณะการทำงานของ malware เนื่องด้วยระบบปฏิบัติการที่รัน malware เป็นระบบปฏิบัติการที่สร้างขึ้นบน vmware ดังนั้นนักวิเคราะห์มัลแวร์จึงไม่ต้องกังวลในกรณีที่ malware จะอันตรายกับระบบปฏิบัติการของตัวเอง<br /><br />แต่ตอนนี้แนวทางการวิเคราะห์ใมัลแวร์ดังกล่าวทำท่าว่าจะมีปัญหาซะแล้ว เนื่องจากนาย <span style="font-weight: bold; color: rgb(0, 153, 0);">Kato Ken</span> นักวิจัยด้านความปลอยภัยคอมพิวเตอร์ชาวญี่ปุ่น ได้ค้นพบวิธีการตรวจสอบว่าระบบปฏิบัติการที่รันอยู่นั้นเป็นระบบที่อยู่บน vmware หรือไม่ โดยใช้ภาษา assembly ไม่เพียงกี่บรรทัดเท่านั้น ถ้าสนใจสามารถอ่านเพิ่มเติมได้<a style="color: rgb(51, 51, 255);" href="http://chitchat.at.infoseek.co.jp/vmware/backdoor.html"><span style="font-weight: bold;">ที่นี่</span></a>ครับ<br /><br />เนื่องจากผมไม่ค่อยมีเวลามาก (ทั้งๆที่แค่ใส่ inline assembly ลงไปในโค้ดไม่กี่บรรทัด แหะๆ) ดังนั้นก็เลยพยายามหาโค้ดสำเร็จรูปสำหรับการทดสอบที่มีชาวบ้านเขียนไว้แล้ว ซึ่งก็ได้พบกับ <a style="font-weight: bold; color: rgb(51, 51, 255);" href="http://www.codeproject.com/system/VmDetect.asp">VmDetect</a> ซึ่งพัฒนาโดย <span style="font-weight: bold; color: rgb(51, 51, 255);">lallous</span> ซึ่งโค้ดของหมอนี่นอกจากจะสามารถตรวจสอบ vmware ได้แล้ว ยังสามารถตรวจสอบ Microsoft Virtual PC ได้ด้วย<br /><br />นี่เป็นภาพที่ทำการรัน VmDetect บนระบบปฏิบัติการธรรมดาครับ<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/vmdetect2.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />ส่วนนี่ก็เป็นภาพที่รัน VmDetect บนระบบปฏิบัติการที่อยู่บน vmware<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/Incident/vmdetect1.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />แล้วมันสำคัญยังไง ? มันสำคัญตรงที่ว่านักพัฒนา malware สามารถใช้ความรู้ตรงจุดนี้เพิ่มความสามารถให้กับ malware เพื่อให้ทำการตรวจสอบว่าตัว malware เองรันอยู่บน vmware หรือไม่ หากรันอยู่บน vmware ตัว malware เองจะไม่ทำงาน หรืออาจะสั่งให้ทำลายระบบปฏิบัติการบน vmware เลยก็ได้... evil ครับ evilTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-72443768403419896922007-08-03T12:06:00.000+07:002007-11-06T14:17:46.308+07:00pulsing zombie<span style="font-weight: bold; color: rgb(51, 51, 255);">zombie </span>ในเชิงของ computer security หมายถึงเครื่องคอมพิวเตอร์ที่ถูกแฮกและถูกนำมาใช้เป็นเครื่องมือเพื่อกระทำสิ่งต่างๆตามที่ผู้บุกรุกต้องการ ไม่ว่าจะเป็นทำการสแกนเครื่องของชาวบ้านเค้า โจมตี DoS (Denial of Service) หรือ DDoS (Distributed Denial of Service) เพื่อทำให้ระบบเครื่อข่ายหรือเซิร์ฟเวอร์เป้าหมายไม่สามารถใช้งานได้อย่างปกติ ด้วยลักษณะของการที่เครื่องคอมพิวเตอร์ที่ถูกแฮค (ตายไปแล้ว) และได้ถูกใช้มาทำการโจมตีระบบอื่นๆอย่างบ้าคลั่ง (ถูกปลุกขึ้นมาและอะละวาด) ทำให้เป็นที่มาของคำว่า zombie นั่นเอง<br /><br />แต่วันนี้ผมจะไม่กล่าวถึง zombie เพราะรู้สึกว่าก็น่าจะรู้จักกันมาพอสมควรแล้ว แต่ที่จะกล่าวในวันนี้จะเป็นรูปแบบหนึ่งที่พัฒนาขึ้นจาก zombie แบบธรรมดา โดยจุดประสงค์ของมันเพื่อหลีกเลี่ยงการตรวจสอบของผู้ดูแลระบบ และถึงแม้สามารถตรวจพบก็ไม่สามารถมั่นใจได้ว่าเป็น zombie หรือไม่ ชื่อของมันคือ pulsing zombie<br /><br /><span style="font-weight: bold; color: rgb(51, 51, 255);">pulsing zombie</span> คือ zombie ประเภทหนึ่ง เป็นเครื่องคอมพิวเตอร์ที่ถูกแฮกและถูกนำมาใช้เพื่อทำการโจมตีระบบอื่นเช่นเดียวกับ zombie แบบธรรมดา แต่อย่างไรก็ตามข้อแตกต่างระหว่าง pulsing zombie และ zombie แบบธรรมดาก็คือ pulsing zombie จะไม่โจมตีเป้าหมายอย่าง "<span style="font-weight: bold; color: rgb(204, 0, 0);">บ้าคลั่ง</span>" (จำนวนมาก/เวลาน้อย) แต่จะโจมตีเหยื่ออย่าช้าๆ ค่อยเป็นค่อยไป (จำนวนปกติ/เวลานาน) ด้วยเหตุนี้เองทำให้มีความยากลำบากในการตรวจสอบ pulsing zombie มากกว่า zombie แบบธรรมดา เพราะลักษณะการโจมตีจะเหมือนการใช้งานธรรมดาของผู้ใช้นั่นเอง<br /><br />โดยปกติแล้ว pulsing zombie มักถูกนำมาใช้เพื่อทำการ slow-down เป้าหมายมากกว่าการ shutdown เป้าหมาย หรือเรียกอีกอย่างหนึ่งว่า <span style="color: rgb(0, 153, 0); font-weight: bold;">Degradation of Service</span> ซึ่งเป็นรูปแบบหนึ่งของ DoS นั่นเอง (ตัวย่อ DoS เหมือนกันด้วย เฮ่อๆ)<br /><br />แล้วทำไมถึงใช้คำว่า "<span style="font-weight: bold; color: rgb(51, 51, 255);">pulsing</span>" ? คำนี้ๆสามารถแปลได้ว่า ลักษณะของบางสิ่งบางอย่างที่มีการเต้นขึ้น-ลง เหมือนกับคลื่นหัวใจ ซึ่งก็ถูกนำมาใช้กับเจ้า zombie รูปแบบนี้ที่คล้ายๆกับคนที่ยังมีชีวิตอยู่นั่นเอง (แต่ที่จริงมันก็ตายไปแล้วนั่นแหละนะ) :)Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com3tag:blogger.com,1999:blog-229158657034239319.post-67324775886237096792007-05-29T16:19:00.000+07:002007-11-20T11:12:34.299+07:00ว่าด้วยเรื่องของ xp_cmdshellหากกล่าวถึง <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">xp_cmdshell </span>บรรดาแฮกเกอร์มือเก๋าหรือหัดใหม่ก็คงรู้จักกันเป็นอย่างดี เนื่องจาก xp_cmdshell เป็น extend stored-procedure ของ Microsoft SQL Server ซึ่งมีความสามารถพิเศษคือ สามารถใช้รันคำสั่งของระบบปฏิบัติการได้<br /><br /><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">exec master..xp_cmdshell 'dir'</span><br /><br />ซึ่งหากอยากจะให้ MSSQL ของเราปลอดภัยจากการโดนยิงในระดับนึงแล้ว เราควรทำการปิดการใช้งาน xp_cmdshell ด้วยคำสั่งดังต่อไปนี้<br /><br /><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">exec sp_dropextendedproc 'xp_cmdshell'</span><br /><br />คำสั่งดังกล่าวต้องรันด้วยสิทธิของ Administrator หรือ sa ของ MSSQL ถึงจะสามารถดร็อป stored-procedure ดังกล่าวได้ครับ<br /><br />อย่างไรก็ตามวิธีการ drop stored-procedure ดังกล่าวไม่สามารถป้องกันการโดนโจมตีจาก xp_cmdshell ได้ร้อยเปอร์เซ็นต์ เนื่องจากหากผู้บุกรุกมีสิทธิสูงอย่างเพียงพอ ผู้บุกรุกสามารถใช้คำสั่งดังต่อไปนี้เพื่อดึง xp_cmdshell กลับมาได้<br /><br /><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">exec sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'</span><br /><br />ดังนั้นเพื่อความชัวร์จึงควรลบไฟล์ <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">xplog70.dll</span> ออกไปจากระบบด้วย ซึ่้งการลบไฟล์นี้ออกไปจากระบบ จะทำให้ stored-procedure ดังต่อไปนี้ไม่สามารถใช้งานได้<br /><ul><li style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">xp_sscanf</li><li style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">xp_sprintf</li><li style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">xp_msver</li><li style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">xp_enumgroups</li><li style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">xp_logevent</li><li><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)">xp_loginconfig</span><br /></li></ul>นอกจากนี้การดร็อป xp_cmdshell จะมีผลต่อ stored-procedure อีกหลายน่ะ ติดตามได้จากที่นี่เด้อ <a href="http://support.microsoft.com/kb/891984">http://support.microsoft.com/kb/891984</a><br /><br />หมายเหตุ: ถ้ามีการลง Services Pack ของ MSSQL ต้องคอยตรวจสอบด้วยว่าไฟล์ xplog70.dll ได้กลับมาหรือไม่ ในกรณีที่เราลบไฟล์นี้ออกไปจากระบบแล้วTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-36299833813242865802007-05-15T11:28:00.000+07:002007-11-06T14:12:31.167+07:00การดูเวลาที่สร้างและเวลาครั้งสุดท้ายที่ทำการแก้ไขไฟล์ PDFวันก่อนเจอ case เกี่ยวข้องกับการปลอมเอกสาร PDF ก็เลยนำมาเล่าสู่กันฟังเด้อ :) โจทย์ก็คือเราจะสามารถทราบได้อย่างไรว่าไฟล์เอกสาร PDF ที่ทำการตรวจสอบนั้น ถูกสร้างขึ้นเมื่อใดและถูกแก้ไขครั้งสุดท้ายเมื่อใด<br /><br />วิธีการดูค่าเวลาต่างๆของไฟล์ PDF นั้นจะดูที่ค่า metadata ของไฟล์ PDF นั่นเอง ซึ่งสามารถดูได้ด้วยวิธีการนี้<br /><br /><br /><ul><li>เปิดไฟล์ PDF ที่ต้องการตรวจสอบด้วยโปรแกรม Adobe Reader</li><li>คลิกที่เมนู <strong>File</strong> แล้วเลือกที่ <strong>Document Properties...</strong></li></ul><p align="center"><a href="http://photobucket.com" target="_blank"><img alt="Photo Sharing and Video Hosting at Photobucket" src="http://i136.photobucket.com/albums/q196/triratp/Incident/PDF01.png" border="0" /></a></p><ul><li>ที่ tab ชื่อ Description จะมีข้อมูลเกี่ยวข้องกับไฟล์ PDF อยู่ไม่ว่าจะเป็น ผู้ที่ทำการสร้างไฟล์ (<strong>Author</strong>), เวลาที่ทำการสร้างไฟล์ (<strong>Created</strong>) หรือ เวลาครั้งสุดท้ายที่ทำการแก้ไขไฟล์ (<strong>Modified</strong>)</li></ul><p align="center"><a href="http://photobucket.com" target="_blank"><img alt="Photo Sharing and Video Hosting at Photobucket" src="http://i136.photobucket.com/albums/q196/triratp/Incident/PDF02.png" border="0" /></a></p>เวลาที่ทำการสร้างไฟล์และเวลาครั้งสุดท้ายที่ทำการแก้ไขไฟล์ที่ดูด้วยวิธีนี้นั้นมีความน่าเชื่อถือมากกว่าวิธีการดูด้วยคำสั่ง dir เนื่องจากค่าที่ได้จากคำสั่ง dir นั้นจะเปลี่ยนแปลงไปเมื่อไฟล์ถูก copy หรือดาวน์โหลดมาจากที่อื่น ในขณะที่ค่าเวลาที่ดูด้วยวิธีการดังกล่าวนั้นจะไม่เปลี่ยนแปลงถึงเม้ว่าไฟล์นั้นจะถูกย้ายไปไว้ที่อื่นก็ตาม ซึ่ง forensic investigator สามารถใช้ค่าเวลาดังกล่าวในการวิเคราะห์และสร้างความสัมพันธ์ของเหตุการณ์ได้<br /><br />อย่างไรก็ตามค่า metadata ดังกล่าวของไฟล์ PDF นั้นสามารถปลอมแปลงได้ ซึ่งอาจทำให้ผู้ที่ทำการปลอมแปลงเอกสารนั้น ทำการปลอมแปลงวันเวลาที่สร้างเอกสารให้เป็นวันที่เกิดขึ้นก่อนเอกสารของฝ่ายเรา ทำให้ดูเหมือนว่าเอกสารของเราเป็นของปลอม ดังนั้น forensic investigator จึงควรระวังตรงจุดนี้ไว้ สำหรับวิธีการรับมือกับการปลอมเวลาการสร้างไฟล์ PDF นั้นสามารถทำได้โดยการทำ construct timeline ของ activitity ของไฟล์บนระบบ ซึ่งถ้า activity timeline ไม่ตรงกับเวลาที่ไฟล์ถูกสร้างขึ้น เราจะสร้างใช้ข้อมูลตรงจุดนี้ทำการแย้งได้ (วิธีนี้จะใช้ได้ผลก็ต่อเมื่อค่า MAC ของไฟล์บนระบบไม่ถูกปลอมแปลงให้สัมพันธ์กับค่า metadata ของไฟล์ PDF)<br /><br />P.S. การแก้ไขค่า metadata ของไฟล์ PDF จะทำให้ค่า checksum ของไฟล์เปลี่ยนไปด้วย ดังนั้นเราจึงควรเก็บ checksum ของไฟล์เราไว้ด้วยเสมอTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-61726439457670472042007-05-10T14:14:00.000+07:002007-11-20T11:12:34.299+07:00ความสำคัญของ Audit Process Trackingหากใครทำการปรับแต่ง Log ของระบบปฏิบัติการ Windows ก็คงจะพบคุ้นเคยกับคำว่า <a href="http://technet2.microsoft.com/windowsserver/en/library/0a642c0c-387a-44f5-bfd9-951b87fd13801033.mspx?mfr=true">Audit Process Tracking</a> กันมาบ้าง เจ้า Audit Policy ตัวนี้จะทำการเก็บล็อคข้อมูลของโปรเซสที่ทำงานบนระบบ ซึ่งโดยปกติแล้วเราก็ไม่ได้สนใจแล้ว Audit Policy ตัวนี้กันสักเท่าไหร่ (เพราะปกติจะสนใจแต่ Logon/Logoff น่ะนะ)<br /><br />แต่แล้วหลังจากที่ได้อ่านข้อมูลจาก<a href="http://forensicir.blogspot.com/2007/05/analyzing-intrusion-part-iii-corporal.html">ที่นี่</a> ผมก็เริ่มสนใจเจ้า Audit Policy ตัวนี้ขึ้นมาทันที เนื่องจากเจ้า Audit Policy ตัวนี้<br />ให้ข้อมูลที่ค่อนข้างจะมีประโยชน์มากสำหรับการตรวจสอบระบบหลังจากเกิดการบุกรุกขึ้น โดยเฉพาะอย่างยิ่งมีโปรเซสใดที่เกิดขึ้นใหม่หลังจากเวลาที่คาดว่าเกิดการบุกรุก โปรเซสขึ้นใหม่ที่เกิดขึ้นหลังจากการบุกรุกนี้ มีโอกาสที่จะเป็นโปรเซสที่ผู้บุกรุกทำการรันได้<br /><br />หลังจากที่ทำการ enable Audit Process Tracking แล้ว เราสามารถทำการเรียกดูโปรเซสที่เกิดขึ้นได้ด้วยคำสั่งของ Microsoft Log Parser ดังนี้<br /><br /><span style="color: rgb(153, 0, 0);">C:\Program Files\Log Parser 2.2>LogParser -i:EVT -o:DATAGRID </span><br /><span style="color: rgb(153, 0, 0);">"select EventID, </span><br /><span style="color: rgb(153, 0, 0);">EXTRACT_TOKEN(Strings, 0, '|') AS ProcessID, </span><br /><span style="color: rgb(153, 0, 0);">EXTRACT_TOKEN(Strings, 1, '|') AS ProcessName, </span><br /><span style="color: rgb(153, 0, 0);">EXTRACT_TOKEN(Strings, 2, '|') As ParentProcessID, </span><br /><span style="color: rgb(153, 0, 0);">EXTRACT_TOKEN(Strings, 3, '|') AS User </span><br /><span style="color: rgb(153, 0, 0);">from security where eventid in (592)"</span><br /><br />ผลลัพธ์ที่ได้เป็นดังภาพ<br /><br /><a href="http://photobucket.com" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/audit.png" border="0" alt="Photo Sharing and Video Hosting at Photobucket" /></a><br /><br />คำสั่งของ LogParser ดังกล่าวเป็นการแสดงโปรเซสที่เกิดขึ้นบนระบบ (EventID คือ 592) ซึ่งจะแสดงหมายเลขโปรเซส (ProcessID), ชื่อของโปรเซส (ProcessName), หมายเลขของโปรเซสที่ทำการเรียกโปรเซสนั้น (ParentProcessID) และชื่อของผู้ใช้ที่ทำการรันโปรเซสนั้น (User)<br /><br />หากต้องการทราบว่าโปรเซสใดที่จบการทำงานไป สามารถทำได้โดยการกำหนดหมายเลข EventID เป็น 593<br /><br />การเปิดใช้งาน Audit Process Tracking มีประโยชน์มากสำหรับระบบที่เป็น <a href="http://www.blogger.com/post-edit.g?blogID=229158657034239319&postID=6172643945767047204">honeypot</a> เนื่องจาก honeypot นั้นจะเกิดประโยชน์สูงสุดก็ต่อเมื่อตัว honeypot เองนั้นถูกบุกรุก เช่นเดียวกับเจ้า Audit Policy ตัวนี้ที่จะเกิดประโยชน์สูงสุดเช่นกันหลังจากเกิดเหตุการณ์บุกรุกขึ้นแล้ว :)Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-57395918619636663582007-05-02T11:49:00.000+07:002007-11-20T11:13:45.646+07:00การกำจัด malware ที่ใช้เทคนิค DLL injectionเนื่องจากเมื่อวานไปเจอ malware ที่ใช้ DLL injection เข้าไปยัง process ของระบบ ก็เลยมาเล่าสู่กันฟังครับ (ความจริงเขียนไว้กันลืมตะหาก 555) แต่ก่อนที่เล่าถึง malware ตัวดังกล่าว จะขออธิบายก่อนสักเล็กน้อยว่า DLL injection นั้นคืออะไร<br /><br /><span style="font-weight: bold; color: rgb(51, 51, 255);">DLL injection</span> เป็นเทคนิคที่นักเขียน malware นิยมนำมาใช้ในการฝัง malicious code ในระบบ โดย malicious code ที่ทำการฝังลงไปนั้นจะอยู่ในรูปของ DLL ซึ่งจะถูกฝังเข้าไปยัง process ที่ทำงานอยู่ในระบบเช่น explorer.exe ซึ่งถ้าหาก incident handler ไม่ได้ทำการตรวจสอบ DLL ที่แต่ละ process ทำการโหลด ก็จะไม่ทราบว่าระบบถูกฝัง malware ลงไป เนื่องจาก malware ที่ใช้วิธีนี้เวลาทำงาีนจะไม่ทำการสร้าง process ใหม่ แต่จะสร้าง thread จาก process เดิม ซึ่งไม่สามารถมองเห็นด้วย task manager<br /><br />เรื่องเริ่มขึ้นเมื่อเครื่องของชาวบ้านคนหนึ่ง หลังจากที่ทำการเปิดเครื่อง nod32 จะทำการแจ้งเตือนทุกครั้ง<br /><br /><a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/01.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />ข้อความแจ้งเตือนดังกล่าวเป็นการบอกว่า <span style="font-weight: bold; color: rgb(255, 0, 0);">explorer.exe</span> ได้ทำการสร้าง malware ขึ้นมา ??!<br /><br />เมื่อทำการสำรวจ process ที่รันอยู่พบว่ามี explorer.exe รันอยู่เพียงโปรเซสเดียวเท่านั้น ซึ่งเป็น explorer.exe ของระบบ แต่เมื่อเรียกดู DLL ที่ explorer.exe ทำการโหลดเข้าไปนั้นพบว่ามี DLL ที่แปลกประหลาดอยู่<br /><br />่<a href="http://photobucket.com/" target="_blank"><img src="http://i136.photobucket.com/albums/q196/triratp/02.png" alt="Photo Sharing and Video Hosting at Photobucket" border="0" /></a><br /><br />DLL ที่แปลกประหลาดคือ DLL ที่ถูกไฮไลต์ด้วยสีม่วง ซึ่งเป็น DLL ที่ถูก packed หรือทำการเข้ารหัส เมื่อใช้ nod32 ทำการแสกน DLL เหล่านี้ก็ไม่พบความผิดปกติแต่อย่างไร<br /><br />เมื่อได้รายชื่อของ DLL ที่น่าสงสัย ขั้นตอนต่อไปคือนำรายชื่อของ DLL เหล่านี้ไปคำการค้นหาในตำแหน่ง Auto-Start ต่างๆใน registry key ซึ่งจากการค้นหาพบว่ารายชื่อของ DLL เหล่านี้ปรากฏอยู่ใน<br /><br /><span style="color: rgb(51, 51, 255); font-weight: bold;">HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks</span><br /><span style="color: rgb(51, 51, 255); font-weight: bold;">HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects</span><span style="color: rgb(51, 51, 255); font-weight: bold;"><br />HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify</span><br /><br />ผมจึงได้ทำการลบ registry key ที่มีชื่อของ malicious DLL ทิ้งไปแล้วทำการ reboot ระบบ แต่เมื่อทำการล็อกอินเข้ามาใหม่พบว่า nod32 ยังคงแจ้งเตือนเหมือนเดิม แต่ชื่อของไฟล์เปลี่ยนไป ผมจึงได้ทำการตรวจสอบ explorer.exe ใหม่อีกครั้ง และพบว่ายังคงถูก DLL inject เข้าไปเหมือนเดิม โดยรายชื่อ malicious DLL นั้นจะมีชื่อที่เหมือนเดิม 2 ไฟล์คือ<br /><br /><span style="font-weight: bold; color: rgb(51, 51, 255);">ssqolij.dll</span><br /><span style="font-weight: bold; color: rgb(51, 51, 255);">vturp.dll</span><br /><br />ทั้ง 2 ไฟล์อยู่ใน directory C:\WINDOWS\system32 สำหรับ malicious DLL ตัวอื่นนั้นชื่อจะ random เปลี่ยนไปเรื่อยๆ<br /><br />ผมจึงได้ทำการ <span style="color: rgb(51, 51, 255); font-weight: bold;">monitoring การเข้าถึง registry key</span> เพื่อทำการตรวจสอบว่ามี process ใดเข้าถึง registry key ของ ssqolij.dll หลังจากที่ทำการลบ key เหล่านี้ทิ้งไป ซึ่งพบว่า <span style="color: rgb(255, 0, 0); font-weight: bold;">winlogon.exe</span> ซึ่งเป็น process ของระบบ (ดูจาก process tree) มีการเรียกดู registry key เหล่านี้ตลอดเวลา และเมื่อใดก็ตามที่ทำการลบ registry key เหล่านี้ทิ้งไป winlogon.exe ก็จะทำการสร้าง key ก็จะทำการสร้าง key ขึ้นมาใหม่ นี่จึงเป็นสาเหตุที่ว่าทำไม registry key เหล่านี้กลับมาอยู่ในระบบ<br /><br />นอกจากนี้ผมได้ทำการสำรวจ DLL ที่ winlogon.exe ทำการโหลดเข้ามาในระบบ พบว่า winlogon.exe ถูก DLL injection เหมือนกัน ซึ่งมี 2 ไฟล์หลักคือ ssqolij.dll และ vturp.dll<br /><br />เนื่องจาก winlogon.exe เป็น process ที่ทำหน้าที่เกี่ยวกับการล็อกอินของระบบ หากเราทำการ kill process นี้ไปจะทำให้เกิดอาการจอฟ้า ดังนั้นผมเลือกที่จะทำการ <span style="font-weight: bold; color: rgb(51, 51, 255);">suspend winlogon.exe</span> ซึ่งปรากฏว่าได้ผล กล่าวคือไม่มีการเข้าถึง registry key จาก winlogon.exe อีก ในขณะเดียวกันระบบก็ไม่ขึ้นจอฟ้า ซึ่งทำให้ผมสามารถทำงานต่อไปได้<br /><br />เมื่อหยุด winlogon.exe ได้ ผมจึงทำการลบ regiskey key ทิ้งไป จากนั้นใช้ <a style="font-weight: bold;" href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/pendmoves.mspx">movefile</a> ทำการกำหนด schedule ให้ทำการลบ malicious DLL ทิ้งไปหลังจากที่ระบบทำการ reboot ใหม่ พบว่า malicious DLL ได้ถูกลบไป และ winlogon.exe และ explorer.exe ก็ไม่ถูก DLL injection อีกต่อไป :)<br /><br />P.S. พอดี capture รูปมาไม่ครบน่ะนะ แหะๆTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com15tag:blogger.com,1999:blog-229158657034239319.post-69474901237567436472007-04-27T10:59:00.000+07:002007-11-06T14:12:31.168+07:00ว่าด้วยเรื่องของ MAC timesหนึ่งในวิธีที่บรรดา incident handler นิยมทำกันในการสืบสวนอาชญากรรมคอมพิวเตอร์คือ การดู timeline ที่เกิดขึ้นบนระบบว่ามีไฟล์ใดถูกสร้างหรือถูกเปลี่ยนแปลงก่อน - หลังจากที่เกิดเหตุการณ์บุกรุกบ้าง การสร้าง timeline จะช่วยให้ incident handler สามารถลำดับเหตุการณ์ต่างๆที่เกิดขึ้นในระบบได้มีประสิทธิภาพมากขึ้น<br /><br />โดยปกติแล้ว timeline ของเหตุการณ์จะใช้ข้อมูลจากเวลาที่ไฟล์ถูกเปลี่ยนแปลง (Modified) เวลาที่ไฟล์ถูกเข้าถึง (Accessed) และเวลาที่ไฟล์ถูกสร้างขึ้น (Created) ซึ่งข้อมูลของเวลาเหล่านี้เรียกอีกอย่างหนึ่งว่า <span style="font-weight: bold; color: rgb(51, 51, 255);">MAC times</span><br /><br />การเรียกดู MAC times บนระบบปฏิบัติการ Windows สามารถทำได้โดยใช้คำสั่ง <span style="color: rgb(51, 51, 255); font-weight: bold;">dir /TW</span>, <span style="font-weight: bold; color: rgb(51, 51, 255);">dir /TA </span><span style="color: rgb(51, 51, 255);"><span style="color: rgb(0, 0, 0);">และ </span></span><span style="font-weight: bold; color: rgb(51, 51, 255);">dir /TC</span> ตามลำดับ ตัวอย่างผลลัพธ์ของการเรียกดูเวลาที่ไฟล์ถูกสร้างขึ้นแสดงดังข้างล่าง<br /><br /><span style="color: rgb(51, 51, 255);">C:\Documents and Settings\Trirat\Desktop\Sysinternals><span style="font-weight: bold;">dir /TC</span></span><br /><span style="color: rgb(51, 51, 255);"> Volume in drive C has no label.</span><br /><span style="color: rgb(51, 51, 255);"> Volume Serial Number is 3CCF-7B7F</span><br /><br /><span style="color: rgb(51, 51, 255);"> Directory of C:\Documents and Settings\Trirat\Desktop\Sysinternals</span><br /><br /><span style="color: rgb(51, 51, 255);"><span style="font-weight: bold;">04/24/2007 11:34 AM</span> DIR .</span><br /><span style="color: rgb(51, 51, 255);"><span style="font-weight: bold;">04/24/2007 11:34 AM</span> DIR ..</span><br /><span style="color: rgb(51, 51, 255);"><span style="font-weight: bold;">04/24/2007 11:31 AM</span> 475,790 Autoruns.zip</span><br /><span style="color: rgb(51, 51, 255);"><span style="font-weight: bold;">04/24/2007 11:51 AM</span> 1,539,243 ProcessExplorer.zip</span><br /><span style="color: rgb(51, 51, 255);"><span style="font-weight: bold;">04/24/2007 11:44</span> <span style="font-weight: bold;">AM</span> DIR PsTools</span><br /><span style="color: rgb(51, 51, 255);"><span style="font-weight: bold;">04/24/2007 11:40</span> <span style="font-weight: bold;">AM</span> 1,022,681 PsTools.zip</span><br /> <span style="font-weight: bold; color: rgb(51, 51, 255);"></span><br />ถึงแม้ว่าการสร้าง timeline ของเหตุการณ์จาก MAC times จะเป็นเครื่องอำนวยความสะดวกให้กับ incident handler แต่ทว่าความน่าเชื่อถือของ MAC times นั้นเป็นสิ่งที่ incident handler ควรระมัดระวังเนื่องจาก MAC times ของไฟล์ต่างๆนั้น<span style="font-weight: bold; color: rgb(51, 51, 255);">สามารถปลอมแปลง</span>ได้ !!?<br /><br />เครื่องมือที่ใช้สำหรับปลอมแปลง MAC times มีอยู่มากมาย แต่ในที่นี้จะใช้เครื่องมือจาก Metasploit Anti-Forensics Project ที่ชื่อว่า <span style="font-weight: bold; color: rgb(51, 51, 255);">timestomp</span><br /><br /><span style="color: rgb(51, 204, 0);">C:\Documents and Settings\Trirat\Desktop\Sysinternals> <span style="font-weight: bold;">dir /TC PsTools.zip</span></span><br /><span style="color: rgb(51, 204, 0);"> Volume in drive C has no label.</span><br /><span style="color: rgb(51, 204, 0);"> Volume Serial Number is 3CCF-7B7F</span><br /><br /><span style="color: rgb(51, 204, 0);"> Directory of C:\Documents and Settings\Trirat\Desktop\Sysinternals</span><br /><br /><span style="color: rgb(51, 204, 0);"><span style="font-weight: bold;">04/24/2007 11:40 AM</span> 1,022,681 PsTools.zip</span><br /><br /><span style="color: rgb(51, 51, 255);">C:\Documents and Settings\Trirat\Desktop\Sysinternals><span style="font-weight: bold;"> timestomp.exe PsTools.zip -c</span></span><span style="color: rgb(51, 51, 255); font-weight: bold;"> "Sunday 1/1/2007 1:11:11 AM"</span><br /><br /><span style="color: rgb(51, 204, 0);">C:\Documents and Settings\Trirat\Desktop\Sysinternals><span style="font-weight: bold;"> dir /TC PsTools.zip</span></span><br /><span style="color: rgb(51, 204, 0);"> Volume in drive C has no label.</span><br /><span style="color: rgb(51, 204, 0);"> Volume Serial Number is 3CCF-7B7F</span><br /><br /><span style="color: rgb(51, 204, 0);"> Directory of C:\Documents and Settings\Trirat\Desktop\Sysinternals</span><br /><br /><span style="color: rgb(51, 204, 0); font-weight: bold;">01/01/2007 01:11 AM </span><span style="color: rgb(51, 204, 0);">1,022,681 PsTools.zip</span><br /><br />จากตัวอย่างข้างบนแสดงการใช้งาน timestomp สังเกตว่าก่อนการใช้ timestomp นั้นเวลาที่ไฟล์ PsTools.zip ถูกสร้างขึ้นคือวันที่ 04/07/2007 เวลา 11.40 หลักจากนั้นจึงใช้ timestomp ทำการปลอมแปลงเวลาที่ไฟล์ถูกสร้างขึ้นให้เป็นวันที่ 01/01/2007 เวลา 01:11<br /><br />เนื่องด้วยการปลอมแปลง MAC times สามารถทำได้อย่างง่ายดาย ดังนั้น incident handler จึงควรระมัดระวังตรงจุดนี้ไว้ :)Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-61199274033346226322007-04-24T23:24:00.000+07:002007-11-20T11:12:34.300+07:00เปรียบเทียบความสามารถของ tlist และ pslistในปัจจุบัน <span style="color: rgb(51, 51, 255); font-weight: bold;">live response</span> (กระบวนการ forensic แบบสดๆ - ไม่รู้ว่าจะแปลเป็นไทยว่ายังไงดี 555 - โดยการวิเคราะห์จะอาศัยข้อมูลแบบ volatile ซึ่งเป็นข้อมูลที่หายไปเมื่อระบบทำการ reboot เช่น ข้อมูลใน RAM เป็นต้น) ได้รับความนิยมมากขึ้นอันเนื่องมาจากเทคนิคการบุกรุกในปัจจุบันมีความซับซ้อนมากขึ้น<br />และกระบวนการ forensic แบบเก่า (ที่ทำการ duplicate image ของ harddisk แล้วทำการวิเคราะห์ทีหลัง) ก็ไม่สามารถนำมาใช้ในการวิเคราะห์หลักฐานได้่อย่างมีประสิทธิภาพ (หลักฐานอาจอยู่ใน memory ซึ่งไม่ได้ทำการเก็บข้อมูลในส่วนนั้นมา) นั่นเอง<br /><br />เมื่อพูดถึง live response ข้อมูลของระบบอย่างหนึ่งที่ Incident Handler ควรที่จะสนใจคือข้อมูลของ process ที่กำลังรันอยู่บนระบบที่ทำการสืบสวน ซึ่ง tools แบบ command-line ยอดนิยมสำหรับเก็บข้อมูลของ process ที่รันอยู่บนระบบได้แก่ <span style="font-weight: bold; color: rgb(51, 51, 255);">tlist</span><span style="color: rgb(51, 51, 255);"> </span>และ <span style="font-weight: bold; color: rgb(51, 51, 255);">pslist</span><br /><br />คราวนี้ก็เลยเกิดคำถามขึ้นมาว่าตัวไหนดีกว่ากัน ว่าแล้วก็เลยนำ feature ของเจ้า 2 ตัวนี้มาเปรียบเทียบกัน ซึ่งผลที่ได้มีดังต่อไปนี้<br /><br /><span style="font-weight: bold; color: rgb(51, 51, 255);">ข้อดี</span>ของ<span style="color: rgb(51, 51, 255);"> <span style="font-weight: bold;">tlist</span> </span>ที่ pslist ไม่มี<br /><ol><li>tlist สามารถเรียกดู command-line รวมทั้ง path ของ executable image ที่ไว้ใช้สำหรับทำการรัน process ได้ โดยใช้คำสั่ง <span style="font-weight: bold; color: rgb(51, 51, 255);">tlist -c</span><br /></li><li>tlist สามารถทำการ map ระหว่าง process กับรายชื่อของ service โดยใช้คำสั่ง <span style="color: rgb(51, 51, 255); font-weight: bold;">tlist -s</span></li></ol><span style="font-weight: bold; color: rgb(51, 51, 255);">ข้อดี</span>ของ <span style="font-weight: bold; color: rgb(51, 51, 255);">pslist</span> ที่ tlist ไม่มี<br /><ol><li>pslist สามารถเรียกดู process ของ remote machine ได้ <span style="color: rgb(51, 51, 255); font-weight: bold;">pslist \\machine-name -u Administrator</span></li><li>pslist สามารถเรียกดูระยะเวลาที่ process ทำการรันว่ารันมาได้นานเท่าใด ซึ่งเมื่อรัน <span style="font-weight: bold; color: rgb(51, 51, 255);">pslist</span> เฉยๆก็จะแสดงออกมา<br /></li><li>pslist สามารถเรียกดูข้อมูลของ memory และ thread ของแต่ละ process ได้โดยใช้คำสั่ง pslist -x (แต่รู้สึกไม่ค่อยมีประโยชน์เท่าไหร่เลยน่ะ)</li></ol>ข้อดีที่มีทั้งใน tlist และ pslist<br /><ol><li>ทั้ง 2 ตัวนี้สามารถเรียกดู process tree ได้โดยใช้ <span style="color: rgb(51, 51, 255); font-weight: bold;">tlist -t</span> และ <span style="color: rgb(51, 51, 255); font-weight: bold;">pslist -t</span> ตามลำดับ</li></ol>สรุปก็คือควรใช้ทั้งสองตัวในการเก็บข้อมูลเกี่ยวกับ process นั่นแหละนะ :)Trirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0tag:blogger.com,1999:blog-229158657034239319.post-36658689054851043882007-04-24T23:10:00.001+07:002007-11-20T11:13:45.648+07:00การดู Last Write Time ของ Registry Keyการเรียกดู last write time ของ registry (เวลาที่ registry ถูกเปลี่ยนแปลงล่าสุด) ไม่ค่อยเป็นที่สนใจกันมากนัก อย่างไรก็ตาม last write time ของ registry จะมีประโยชน์ในกรณีที่ incident handler ทำการสันนิษฐานว่าผู้บุกรุกได้ทำการติดตั้ง Malware ลงไปใน services ของระบบปฏิบัติการ Windows โดยรายชื่อของ services ในระบบจะปรากฏอยู่ที่ registry ที่ชื่อว่า<br /><br /><span style="color: rgb(51, 102, 255);"><strong>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services</strong></span><br /><br />ในการที่ผู้บุกรุกจะทำการติดตั้ง services ลงไปในระบบปฏิบัติการ Windows จะต้องมีการสร้าง key ขี้นมาใหม่ หรือทำการแก้ไขค่าของ key ที่มีอยู่แล้ว ซึ่งไม่ว่าผู้บุกรุกจะเลือกวิธีไหนก็ตาม ค่าของ last write time ของ registry จะต้องมีการเปลี่ยนแปลง ดังนั้นหาก incident handler ทำการสังเกตุค่านี้จะช่วยให้สามารถทำการลำดับเหตุการณ์ได้ดียิ่งขึ้น :)<br /><br />สำหรับการเรียกดูเวลาที่ registry key ถูกเปลี่ยนแปลงล่าสุดสามารถทำได้โดย<br />1. เรียก regedit ขึ้นมา แล้วทำการ browse ไปยัง key ของ services ที่เราสนใจ<br />2. ให้ click ขวาที่ key ที่ต้องการแล้วเลือก export จากนั้นให้ save ผลลัพธ์เป็น .txt<br />3. เมื่อทำการเปิดไฟล์นี้จะพบ ค่า Last Write Time สำหรับแต่ละค่าต่างๆที่อยู่ใน registry key นั้น :)<br /><br />ตัวอย่างอยู่ข้างล่างครับ<br /><br /><span style="color: rgb(51, 102, 255);"><strong>Key Name: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\-<br />Services\HTTP</strong></span><br /><span style="color: rgb(51, 102, 255);"><strong>Class Name: NO CLASS</strong></span><br /><span style="color: rgb(51, 102, 255);"><strong>Last Write Time: 23/4/2550 - 9:48</strong></span><br /><br />P.S. ค่า last write time สำหรับแต่ละ services จะถูกเปลี่ยนแปลงทุกครั้งหลังจากระบบทำการ reboot ดังนั้นถ้าระบบที่เราทำการตรวจสอบถูก reboot หลังจากที่ผู้บุกรุกทำการติดตั้ง malware ลงไปใน services แล้ว จะทำให้การสืบสวนด้วยค่า last write time ไม่มีประโยชน์ครับ<br /><br />P.S. การสืบสวนด้วยค่า last write time จะมีประสิทธิภาพก็ต่อเมื่อระบบตั้งอยู่บนสมมติฐานที่ว่าค่า last write time ไม่สามารถปลอมแปลงได้ ซึ่งในปัจจุบันยังไม่มี Windows API ที่สามารถทำแบบนั้นได้ (ข้อมูลอ้างอิงจาก Windows Forensic Analysis ของ Harlan Carvey) ดังนั้นหมายความว่าการใช้ค่า last write time ของ registry เป็นแนวทางในการสืบสวนยังสามารถทำได้อยู่ครับTrirat Puttaraksahttp://www.blogger.com/profile/05733396334545897735noreply@blogger.com0