Pages

6/25/2013

สร้าง SSH Key สำหรับติดต่อกับเครื่อง EC2 แบบไม่ต้องพิมพ์รหัสผ่าน

สร้าง SSH Key สำหรับติดต่อกับเครื่อง EC2 แบบไม่ต้องพิมพ์พาสเวิร์ด


หมายเหตุ: ในที่นี้ใช้ EC2 ที่มี OS แบบที่เป็น Ubuntu-based นะครับ

ก่อนอื่น แก้ไขไฟล์ /etc/ssh/sshd_config เพื่อเปิดใช้งาน AuthorizedKeysFile ก่อน  เพื่อระบุว่า path ของไฟล์ที่เก็บ public key จะให้อ่านจากตรงไหน  โดยค่าปกติ จะเป็น

#AuthorizedKeysFile %h/.ssh/authorized_keys

ก็แค่เอา # ออก หรือจะเพิ่มต่อท้ายไฟล์ก็ได้ ด้วยคำสั่ง

sudo sh -c 'echo "AuthorizedKeysFile %h/.ssh/authorized_keys" >> /etc/ssh/sshd_config'

จริงๆจะต้องเช็คค่า สองตัวนี้ด้วยว่าเป็น yes รึเปล่า

RSAAuthentication yes
PubkeyAuthentication yes

ต่อจากนั้นก็สร้าง user
ในที่นี้ใช้ชื่อ anidear โดยจะสร้างให้มี group หลักเป็นชื่อของตัวเอง และเพิ่ม Group เสริมเป็น admin เพื่อที่จะสามารถใช้สิทธิ์ sudo ได้

sudo useradd -m -s /bin/bash anidear
sudo usermod -G admin anidear
sudo passwd anidear

แล้วใส่ รหัสผ่าน สำหรับ user นี้

ต่อมาก็เข้าไปใช้งาน user นี้ และสร้าง ssh key
su - anidear
ssh-keygen -t rsa -b 1024 

จะขึ้นว่า

Enter file in which to save the key (/home/anidear/.ssh/id_rsa): 

กรอกตำแหน่งที่จะเอาไฟล์ไว้ โดยมาตรฐานจะเป็น ~/.ssh/id_rsa  ถ้าโอเคอยู่แล้วก็กด enter ผ่านได้เลย

ต่อมาจะขึ้นว่า

Enter passphrase (empty for no passphrase):

ตรงนี้จะให้กรอกว่า รหัสผ่านสำหรับเปิดใช้ไฟล์ key นี้ คืออะไร ซึ่งจะเป็นคนละตัวกับรหัสผ่านของ user ที่กรอกไว้ตอนใช้คำสั่ง passwd

แล้วก็เริ่มทำ ให้ ssh key ที่เพิ่งสร้างนี้ใช้งานได้

cd .ssh
cat id_rsa.pub >> authorized_keys
chmod 600 *
cat id_rsa

คัดลอกโค้ดรหัสผ่านตัวนี้ไว้(private key) เก็บลงในไฟล์ในเครื่องที่จะเป็น client (เช่นเก็บไว้ที่ ~/.ssh ของ client) หรือจะใช้ ftp,http,sftp ดึงไว้นี้เก็บไว้ก่อนก็ได้

เสร็จแล้วก็เคลียร์ไฟล์ทิ้ง
rm id_rsa{,pub}
exit

แล้วก็สั่ง service ssh reload ก็ เป็นอันเสร็จพิธี

ส่วนเวลาใช้งาน ก็คือ

สมมุติว่าเก็บ private key ไว้ที่ ~/keys/ec2_private_key
และ public hostname ของเครื่องเป็น ec2-1-1-1-1.ap-southeast-1.compute.amazonaws.com

ใช้ไฟล์ตรงๆเลย ก็จะเป็น
ssh -i  ~/keys/ec2_private_key anidear@ec2-1-1-1-1.ap-southeast-1.compute.amazonaws.com

แต่ถ้าเก็บ key เอาไว้ในระบบ(เครื่องตัวเอง) ก็ ใช้คำสั่ง ssh-add

ssh-add ~/keys/ec2_private_key

จะเป็นการเก็บ private key นี้ไว้ในระบบ ssh ของเครื่อง
ทำให้เวลาต่อไปหา server จะไม่ต้องระบุ path ของไฟล์ private key แล้ว

ssh  anidear@ec2-1-1-1-1.ap-southeast-1.compute.amazonaws.com

แต่เพื่อความสะดวก ยิ่งขึ้น
สามารถ แก้ไฟล์ ~/.ssh/config โดยเพิ่ม

Host anidear_at_ec2
 HostName ec2-1-1-1-1.ap-southeast-1.compute.amazonaws.com
 User anidear
 IdentityFile ~/keys/ec2_private_key

เมื่อทำเสร็จแล้ว ก็ login ตรงๆได้เลย โดยไม่ต้องระบุ username

ssh ec2-1-1-1-1.ap-southeast-1.compute.amazonaws.com

[Optional] 
เนื่องจากการตั้งให้ user ที่เพิ่งสร้างอยู่ในกลุ่ม admin
เวลาเรียกใช้งาน sudo ยังคงจะต้องใช้รหัสผ่านของ user อยู่
ถ้าต้องการให้ไม่ต้องใช้รหัสผ่านเลย ให้ไปสร้างไฟล์เพิ่ม

sudo sh -c 'echo "anidear ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/91-anidear'

[Optional2]
ssh-add จะใช้ private key ในการเพิ่ม key เข้าระบบ แต่จะใช้ public key ในการถอดออก
ดังนั้น ถ้าตอนเพิ่มใช้คำสั่ง

ssh-add ~/keys/ec2_private_key

ตอนถอนออก จะต้องไปดาวน์โหลด public key ที่คู่กับ private key ตัวนั้นออกมา
ในที่นี้ก็คือ ไปคัดลอกมาจาก ภายในไฟล์ ~/.ssh/authorized_keys ของ server
และสมมุติว่า เอามาแปะ และสร้างเป็นไฟล์ชื่อ ec2.pub
เวลาจะถอดออกจะใช้คำสั่ง

ssh-add -d ~/keys/ec2.pub



6/09/2013

อธิบายการทำงานของ Reaver สำหรับ Crack Wifi ที่ใช้ระบบ WPS

วันนี้มีคนถามว่า
"iteasy": ใครลอง reaver wps แล้วมั้ง
"iteasy": สงสัยว่ามัน brute ยังไง
"iteasy": ทำไมเลขไม่เรียงหว่า
"iteasy": 0000001
"iteasy": 0000002
"iteasy": 0000001 0000002 0000003
"iteasy": แบบนี้ไปเรื่อย ๆ
"iteasy": แต่กลับข้าม
"iteasy": 00555678 00565677 00575676
เลยขออ้างอิง บล็อคของ Xelenonz [2.] มาตอบ และ บรรยายเพิ่มเติม ละกัน

โดยในนั้นจะมีคำอธิบายคร่าวๆ ถึงว่า ระบบ WPS (Wi-Fi Protected Setup) คืออะไร, มีช่องโหว่อย่างไร, และวิธีการใช้งานของ Reaver  ซึ่งจะไม่ขอกล่าวซ้ำ ณ ที่นี้

เนื่องจาก ระบบการตรวจสอบรหัสผ่านของ WPS นั้น มีช่องโหว่ในการตรวจสอบรหัสผ่าน (เลข 8 หลัก) ที่ใช้ในการอนุญาตให้เข้าใช้งาน Wi-Fi

โดยช่องโหว่นั้นก็คือ 

แทนที่การตรวจสอบรหัสผ่านจะใช้ตรวจสอบทีเดียวทั้ง 8 หลัก
แต่ระบบ WPS จะทำการแบ่งตัวเลข 8 หลักนั้นเป็น 3 ส่วน คือ PIN1 (4หลักแรก) , PIN2 (3หลักต่อมา) , Checksum (หลักสุดท้าย) และทำการตรวจสอบส่วน PIN1 ก่อน ถ้าถูกแล้วจึงทำการตรวจสอบ PIN2 แต่ถ้าผิดก็จะมีการบอกว่าผิดตั้งแต่การตรวจสอบ PIN1 เลย
นั่นเลยทำให้  จึงทำให้การโยนเลขเข้าไปทดสอบสามารถทำแยกเป็นส่วนๆได้ คือ รันเลข PIN1 ไปจนกว่าจะถูก แล้วจึงค่อยรันเลข PIN2 ก็ได้

ส่วน ค่า Checksum ที่จะต้องเปลี่ยนตามเมื่อมี PIN1 หรือ PIN2 เปลี่ยนไป ดังนั้น จะเปลี่ยนแปลงตลอดอยู่แล้ว และสามารถสร้างขึ้นได้จากการใช้ตัวเลข 7 ตัว (PIN1 และ PIN2) มาสร้าง ดังนั้นจึงไม่มีความจำเป็นที่จะต้องรันเลขหลักนี้

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

00555678, 00565677, 00575676, ...


จะเห็นว่า ค่า PIN1 (4 ตัวแรก) จะมีการรันเลขเป็น
0055, 0056, 0057, ...

แต่ PIN2 (3 ตัวถัดมา) จะยังคงค่าเดิม เพราะส่วนนี้ยังไม่ได้ถูกใช้งาน ซึ่งจะเห็นว่าเป็น
567, 567, 567, ...

และ Checksum (หลักสุดท้าย) จะมีการเปลี่ยนแปลง เนื่องจากมีการเปลี่ยนตัวเลขใน PIN1 หรือ PIN2 ขึ้น จึงจะเห็นว่า เลข checksum นี้ก็จะเปลี่ยนไปด้วย
8, 7, 6, ...

ผลจากช่องโหว่นี้ก็คือ


จากเดิม ถ้าเราไม่รู้หลักการทำงานลึกๆของการยืนยันตัวเองในระบบ WPS , พอเราเห็นเลข 8 หลัก เราก็จะคิดว่าเราจะต้องทดลองแทนค่าตั้งแต่
00000000 ... 99999999 : คิดเป็นจำนวนมากสุด 100,000,000 ครั้ง
แต่พอเรารู้ช่องโหว่นี้ ทำให้เรารู้ว่า
เราต้องทดลองแทนค่าของ PIN1 ก่อน ซึ่งมี 4 หลัก ก็จะทดลองแทนค่า
0000 ... 9999 : คิดเป็นจำนวนมากสุด 10,000 ครั้ง

แล้วเราค่อยทดลองแทนค่า PIN2 ต่อ ซึ่งมีทั้งหมดแค่ 3 หลัก ซึ่งก็จะแทนค่า
000 ... 999 : คิดเป็นจำนวนมากสุด 1,000 ครั้ง

ส่วนเลขหลักสุดท้ายที่เป็น Check-sum นั้น ไม่ต้องนับเพราะมันจะถูกคำนวนจากตัวเลข 7 หลักก่อนหน้าอยู่แล้วได้โดยอัตโนมัติ

ทำให้การใช้งานช่องโหว่นี้ของโปรแกรม Reaver
จะทำให้มีการทดลองแทนค่าเพียง 10000 + 1000 = 11,000 ครั้งเท่านั้น
แทนที่จะเป็น 100,000,000 ครั้ง อย่างวิธีดิบๆอย่างแรก

ผลก็คือ การ bruteforce เพื่อหารหัสของ WPS จะทำได้เร็วขึ้นจากเดิมถึง 909,090 เปอร์เซนต์ !!!


และถ้า การทดลองแทนค่าแต่ละครั้ง ใช้เวลา 3 วินาที (อ้างอิง [2.]) การแทนค่า 11,000 ครั้งจะเสียเวลามากที่สุดอยู่ที่ราวๆ 9 ชม. เท่านั้น! ซึ่งเป็นเวลาที่ไม่ถึงกับรอไม่ได้ และในสถานการณ์จริงอาจจะใช้เวลาน้อยกว่า 9 ชม.มาก (อาจจะอยู่ที่หลักไม่กี่ชม.)

ซึ่งนี่ต่างกับวิธีคิดแบบแทนที่ตรงๆ มาก ซึ่งวิธีนั้นถ้าคำนวนแล้ว อาจจะต้องใช้เวลาถึง 9.5 ปี

หรือต่อให้ถ้าแทนค่าแค่ 7 หลัก แล้วหลักสุดท้ายคำนวนหาค่า checksum แยกเองต่างหาก ยังต้องใช้เวลาเกือบ 1 ปี

ซึ่งถ้าเป็นเช่นนั้น คงไม่มีใครแน่ๆ ที่ยอมเสียเวลากับการพยายามเข้าไปใช้ Wi-Fi Access Point ตัวเดียว ถึงขนาดนั้น .... แต่นี่มันไม่ได้เป็นเช่นนั้น

กลับกัน การเจาะเข้าไปในระบบ WPS ใช้เวลาจริงเพียงไม่กี่ชั่วโมงเท่านั้น !!


ส่วนวิธีการป้องกันนั้น


เนื่องจาก ระบบ WPS นั้นผิดพลาดมาตั้งแต่การออกแบบ จึงไม่สามารถแก้ไขอะไรในกลไกของการตรวจสอบรหัสผ่านได้แล้ว จึงแนะนำให้ปิดการใช้งาน WPS ของ Wi-Fi Access Point ของท่าน และปรับให้ใช้ระบบการลงทะเบียนเข้าใช้งาน ใช้เป็นระบบการเข้ารหัสด้วย WPA2 - AES เพื่อความปลอดภัย ของระบบท่านเอง

อ้างอิง:


  1. Bruteforcing Wifi Protected Setup, by Stefan Viehböck : http://sviehb.files.wordpress.com/2011/12/viehboeck_wps.pdf
  2. Crack Wireless WPA แบบได้ผล 100% , by Xelenonzhttp://blog.ipwned.it/crack-wireless-wpa-แบบได้ผล-100/