ผมมีความเชื่อว่า hacking ใช้ความรู้พื้นฐานเหมือน ๆ กับสาย IT อื่น ๆ อย่างการวางระบบ เขียนโปรแกรมแค่นำมาใช้ต่างจุดประสงค์กันเท่านั้นเอง บทความนี้ตั้งใจจะไว้เป็นแนวทางสำหรับการรักษาและตรวจสอบความปลอดภัยระบบ IT ให้ดีขึ้นสักนิดนึงก็ยังดีครับ

ข้อมูลที่หลุดออกไปเป็นไฟล์ภาพบัตรประชาชนจำนวนมาก (32 GB) สำหรับใช้เปิดเบอร์ใหม่ของ TrueMove H หน้าตาจากข่าวก็ประมาณนี้

https://www.certsandprogs.com/2018/04/another-telco-is-failing-at-security.html

รู้จักกับ Amazon S3 เบื้องต้น

S3 เป็นบริการนึงของ Amazon Web Services (AWS) ย่อมาจาก Simple Storage Service เป็นระบบ public cloud เอาไว้เก็บไฟล์ ซึ่งสามารถเอาไปใช้ประโยชน์ได้หลายอย่างเช่น เก็บไฟล์สาธาณะที่ไม่เป็นความลับสำหรับเว็บที่เช่นรูปหรือ js, css อะไรต่าง ๆ ต้องการให้โหลดเร็ว ๆ เพราะ Amazon มี data center ทั่วโลก บางที่ก็เอาไว้เก็บ backup ข้อมูลขนาดใหญ่ จะเห็นว่ามีจุดประสงค์ทั้งใช้แบบเป็นสาธาณะ (ไฟล์ทั่วไปบนเว็บ) และแบบส่วนตัว (เก็บ backup ข้อมูลในองค์กรเช่น database) ซึ่งเวลาเราใช้ S3 เราจะต้องสร้างสิ่งที่เรียกว่า bucket หรือถังเก็บข้อมูลขึ้นมา ไฟล์ข้างใน bucket จะเรียกว่า object ซึ่งเราสามารถตั้งได้ policy bucket ได้ว่า อยากให้ไฟล์ของเราเข้าถึงได้จากใครบ้าง หรือเข้าถึงได้จากทุกคน (public) โดยสิทธิ์ที่ตั้งได้จะมีสองแบบคือ อ่าน กับ เขียน ซึ่งก็มีท่าแอ๊ดว๊านด้วยเช่นส่งแบบ signed URL หรือ signed cookie คือจะมีค่า token แนบไปด้วยถึงจะเข้าถึงไฟล์ได้เป็นต้น

https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-bucket-permissions.html

จบ S3 แบบย่อคราวนี้มาดูฝั่งแฮกเกอร์ว่าเราจะแฮกได้ยังไง?

ช่องโหว่ Amazon S3 bucket เข้าถึงได้แบบสาธาณะ

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

วิธีการแฮกขอแบ่งเป็น 2 step คือ การหา S3 bucket ว่าหายังไงกับจะดูดข้อมูลยังไง

1.) การค้นหา S3 bucket แบบสาธาณะ

ปกติเวลาเราสร้าง bucket เสร็จเราก็จะได้ URL มาจากชื่อ bucket เรา ซึ่งชื่อตรงนี้ไม่เป็นความลับ ถ้าเราเอาไปใช้ user ทั่วไปอาจเห็นได้ ตัวอย่างชื่อเช่น

https://longcat.s3.amazonaws.com
https://facebook-backup.s3.amazonaws.com

วิธีการหาทำได้ 2 แบบหลัก ๆ คือเหมือนการทำ sub-domain bruteforce ทั่วไป ถ้าเรามี list ของคำที่น่าจะเป็นชื่อ bucket เราก็แค่เขียนโปรแกรมให้มันวนลูปเอาไปเติม

https://<ตรงนี้>.s3.amazonaws.com
http://<ตรงนี้>.s3-ap-southeast-1.amazonaws.com/
http://<ตรงนี้>.s3-eu-west-1.amazonaws.com/...

เพื่อสุ่มหาว่า อาจจะไปเจอชื่อ bucket ที่มีคนสร้างไว้ ซึ่งถ้าลองเข้าแล้วไม่มีมันก็จะขึ้น

แต่ถ้าลองแล้วเจอมี แต่เราไม่มีสิทธิ์เข้าไปดู ไม่ได้ตั้งเป็นสาธาณะจะขึ้นเป็นแบบนี้

ส่วนถ้าเราเจอชื่อ bucket ที่เข้าได้ และตั้งสิทธิ์เป็นแบบสาธาณะ มันก็จะ list ชื่อไฟล์ออกมาให้เราตัวอย่างเช่น http://imgfacebook.s3-eu-west-1.amazonaws.com/

เราก็สามารถเอาชื่อไฟล์ไปต่อใน URL เพื่อโหลดไฟล์ได้ทันที สมมุติว่า bucket นี้เป็นของ TrueMove-H เราก็แค่เข้า http://imgfacebook.s3-eu-west-1.amazonaws.com/<ไฟล์ที่เราจะโหลด>

อย่างในตัวอย่างนี้ไม่ใช่ช่องโหว่ ไม่ได้เป็น security misconfiguration เพราะ bucket นี้จงใจทำมาให้เข้าได้เป็นสาธาณะอยู่แล้ว

อันนี้เป็นวิธีแบบชาวบ้านใช้กัน คราวนี้มาดูทริคแบบแฮกเกอร์ใช้กันนาจา

จริง ๆ แล้วในปัจจุบันเราสามารถหาค้นหาชื่อ domain ที่ขอ SSL/TLS Certificate ได้จาก Certificate Transparency Log (CTL) เอาแบบสั้น ๆ ละกัน Certificate Transparency (CT) คือมาตรฐานค่อนข้างใหม่จาก Google ที่บอกว่าเวลา Certificate Authority (CA) จะออก SSL/TLS Certificate เช่นจะทำให้เว็บเป็น https:// จะต้อง log ว่าตัวเองจะออกให้ domain อะไรลง CTL เพื่อความโปร่งใส ว่าจะไม่มี CA นิสัยไม่ดีออก ใบรับรองเถื่อนเช่นออก https cert ของ google.com เอาไว้ดักข้อมูล ที่เคยเกิดขึ้นจริงในอดีต ซึ่ง CTL มันเป็นอะไรที่ทุกคนดูได้ โปร่งใสไง

http://www.certificate-transparency.org/how-ct-works

ซึ่งก็มี CTL เก็บอยู่หลาย server หลายที่ส่วนใหญ่อยู่ที่ Google ดูเพิ่มเติมได้ที่ Known Logs

ปัญหาคือ มันมีคนหัวหมอ level 1 เอา CTL ไปทำอะไร ผิดจุดประสงค์ เช่นไว้หา OSINT (Open-source intelligence) ว่าองค์กรที่เราจะแฮกมี domain อะไรบ้าง security reseacher หลายคนเรียกเทคนิคนี้ว่าเป็นช่องโหว่ที่จะมาแทน AXFR ในยุคถัดไปเลยทีเดียว

ซึ่งก็มีคนหัวหมอ level 2 ทำ tool และตั้งเซิร์ฟเวอร์ขึ้นมาช่วยค้นหา domain ใน CTL หลาย ๆ server พร้อม ๆ กัน ชื่อโปรเจ็คว่า CertStream ใครใช้ python ก็ลงเล่นกันได้ง่าย ๆ นอกจากนั้นยังมี ยังมี lib ชื่อ certstream ให้เอาไปใช้กันได้หลายภาษา

$ pip install certstream
$ certstream
ตัวอย่างการ query ค่าจาก CTL`

ต่อมาก็คือ มันก็ยังมีคนหัวหมอ level 3 จับเอา certstream มาใช้หา Amazon S3 bucket โดยตั้งชื่อโปรเจ็คว่า Bucket Stream โดยการเอา ชื่อ domain กับชื่อ subdomain ที่อยู่ใน CTL มา permutation สลับ ๆ กันลองเอาไปวนลูป query ใน

https://<ตรงนี้>.s3.amazonaws.com
http://<ตรงนี้>.s3-ap-southeast-1.amazonaws.com/
http://<ตรงนี้>.s3-eu-west-1.amazonaws.com/...

เหมือนที่ผมบอกไปก่อนหน้านี้ พร้อมทั้งลองเติม prefix/suffix ยอดฮิตเช่น -backup อะไรงี้เข้าไป เพื่อทำการหา S3 Bucket เอาไว้แฮก !

ตัวอย่างการ query ค่าของ Bucket Stream จาก certstream จาก CTL

ต่อมามันก็มีคนหัวหมอ level 4 จับเอา Bucket Stream มาใส่ในโปรแกรมเขียนใหม่ด้วยภาษา Go ให้เร็วและใช้ง่าย user-friendly ตั้งชื่อโปรเจ็คว่า slurp ช่วยให้เราหา S3 Bucket ที่ตั้งสิทธิ์เป็นแบบ อ่าน หรือ เขียนแบบสาธาณะได้

ในฐานะที่เราเป็นคนมาอ่าน blog นี้เราเป็นหัวหมอ level 5 อยากลองใช้ไปโหลดแบบ binary มาใช้กันได้ คลิกที่นี่ เวลารันก็จะได้ output ประมาณนี้

$ ./slurp-macos-amd64 keyword -t dtac
INFO[0000] Starting to process permutations....
INFO[0002] FORBIDDEN http://dtac.backup.s3-ap-southeast-2.amazonaws.com/ (dtac)
INFO[0003] FORBIDDEN http://dtacbackup.s3-ap-southeast-1.amazonaws.com/ (dtac)
INFO[0031] FORBIDDEN http://dtacmobile.s3-ap-southeast-1.amazonaws.com/ (dtac)$ ./slurp-macos-amd64 domain -t ais.co.th
INFO[0000] Domain ais.co.th is ais.co.th (punycode)
INFO[0000] Starting to process permutations....
INFO[0000] FORBIDDEN http://ais2.s3.amazonaws.com (http://ais.co.th)
INFO[0000] FORBIDDEN http://ais.s3.amazonaws.com (http://ais.co.th)
INFO[0000] FORBIDDEN http://ais-assets.s3.amazonaws.com (http://ais.co.th)...

จะเห็นว่าจากตัวอย่างเราสามารถ query ค่าใน CTL แบบ permutation แล้วด้วยคีย์เวิร์ดที่เราอยากได้ ได้ เช่นหาคำว่า dtac หรือจะหาแบบ permutation จากชื่อ domain อย่างเราใส่ ais.co.th ไปก็จะช่วยสุ่มหาได้

จะเรียกว่ามันเป็น Google แห่ง S3 bucket ก็ไม่ผิดนัก สมมุติถ้าเจอช่องโหว่มันเข้าได้แบบสาธาณะก็จะขึ้นว่า PUBLIC แบบนี้

จากนั้นเราก็แค่ใช้วิธีแบบที่ผมอธิบายไปก่อนหน้านั้นคือเข้า URL แปะชื่อไฟล์โหลดกลับมาก็จะ สวมบทเป็นแฮกเกอร์ไล่แฮกองค์กรต่าง ๆ ได้ ปีที่แล้วก็มี Uber, Accenture และอีกมากมายหลายบริษัทมีข้อมูลหลุดมาจาก S3 bucket

2.) การดูดข้อมูลทีละมาก ๆ หรือทำลาย แก้ไขข้อมูลจาก S3 bucket แบบสาธาณะ

จากข้อ 1 เราอาจจะเห็นนั่งก๊อปแปะทีละอันมันช้าอะ เรามาใช้ tool ช่วยกันดีกว่าโดย Amazon ทำมาให้เองเลยจ้า ชื่อว่า awscli เป็น command line สำหรับใช้งาน S3

วิธีลงก็แค่ลงผ่าน pip

$ pip install awscli

จากนั้นก็แค่ configure เอ้อ ก่อนใช้ต้องไปเปิดบัญชี AWS เอา AWS Access Key/Access Token มาใส่ใน awscli ก่อนนะ ไม่งั้นจะใช้ไม่ได้ แต่ไม่ต้องเสียตังมันกดเอามาได้ฟรี ดูวิธีการได้ที่นี่

ต่อมาก็แค่รัน

$ aws configure
AWS Access Key ID [None]: xxxx
AWS Secret Access Key [None]: yyy
Default region name [None]:
Default output format [None]: json

ใส่ xxx กับ yyy เป็น key/token ที่ได้มา เวลาจะแฮกก็แค่รันคำสั่งต่าง ๆ

ตัวอย่างสมมุติเช่นจะ list ไฟล์ทั้งหมดว่า bucket ชื่อ truemovex มีไฟล์อะไรอยู่บ้าง

$ aws s3 ls s3://truemovex
2018-04-14 13:37:00 1234 customer-credit-cards.zip
2018-04-14 13:37:00 1234 ggez-all-scanned-id-backup.zip

จากนั้นเราก็สวมบทเป็น Niall Merrigan เทพซ่า 007 โหลดมาให้หมดเลย

$ aws s3 cp --recursive s3://truemovex .

สมมุติว่าถ้า bucket นั้นยอมให้เขียนได้ด้วยเราก็ก๊อปไฟล์ไปใส่ไว้

$ aws s3 cp longcat-trojan-nohelp.exe s3://truemovex

จะเห็นว่า ก็ไม่ได้ยาก ใคร ๆ ก็แฮก Amazon S3 bucket ที่ตั้งค่ามาอย่างไม่ปลอดภัยได้ โปรดนำความรู้เหล่านี้ไปบอกต่อและใช้ในทางที่ถูกอย่าเอาไปแฮกใครเน้อ