2021-10
2021-10-18 - VMware แสดง warning เมื่อพยายามแก้ไข CD/DVD drive
เมื่อพยายามถอด หรือเปลี่ยนแปลงการตั้งค่า CD/DVD drive ที่มีสถานะ Connected อยู่ภายใน VMware มีการแจ้งเตือนว่า "The guest operating system has locked the CD-ROM door and is probably using the CD-ROM, which can prevent the guest from recognizing media changes."

ตัวอย่างเช่นการเอาติ๊ก Connected ออก แล้วสั่งบันทึกการเปลี่ยนแปลง จะขึ้นข้อความเตือนดังรูป

กรณีที่เราต้องการฝืนถอด CD/DVD ออกมา ให้เลือกเป็น yes แล้ว confirm ไป

แต่ในกรณีที่เราไม่ต้องการทำเช่นนั้น ให้เลือก no แล้วเข้าไปภายใน OS ทำการ unmount CD/DVD จาก file systems หากมีการใช้งานอยู่ แล้วสั่ง eject CD/DVD drive เพื่อทำการถอดแผ่นออกมา
หลังจากนั้นกลับมาตรวจสอบที่ VMware (อาจจะต้องทำการ refresh รอบนึง) จะพบว่าค่าถูกเปลี่ยนแปลง CD/DVD drive นั้นไม่มีการติ๊ก Connected แล้ว และจะทำให้เราสามารถเปลี่ยนแปลงการตั้งค่าในส่วนนี้เป็นค่าอื่นได้
ในกรณีที่ VM มี drive มากกว่า 1 ตัว การใช้คำสั่ง eject อาจจะส่งผลแค่ drive แรกเท่านั้น จึงจำเป็นต้องสั่งโดยระบุ drive ที่ต้องการ eject ซึ่งปกติ cdrom drive จะใช้ชื่อ sr ตามด้วยตัวเลขเริ่มจากศูนย์
เมื่อรันคำสั่งดังกล่าว แล้วกลับมาดูที่ VMware อีกที จะพบว่า drive ทั้งหมดไม่มีติ๊ก Connected แล้ว

2021-10-19 - manual chroot
กรณีใช้ rescue mode แล้วไม่สามารถ auto mount filesystem ได้ เช่นต้องซ่อม filesystem บางส่วนก่อน หรือปรับแก้บาง filesystem ก่อนจึงค่อย mount ได้ เราสามารถ manual mount filesystem เอง ดังนี้
โดยจากตัวอย่าง จะมีโครงสร้างดังนี้
/dev/sda1 แทน partition ที่เก็บ boot
/dev/sda2 เป็น partition ที่นำมาทำ volume group
volume group ชื่อ rtvg
filesystem / อยู่ใน lv root ภายใต้ rtvg
2021-10-20 - yum update from DVD installer
ในบางครั้งเราต้องการติดตั้ง package เพิ่มจากแผ่น DVD ซึ่งเราใช้ตอนติดตั้ง OS Linux การติดตั้งด้วย command rpm ทีละ package จะยุ่งยาก เพราะต้องหา dependency file ดังนั้นถ้าเราสามารถติดตั้ง package จากแผ่น DVD ได้ด้วย command yum จะทำให้สะดวกกว่า
เราสามารถทำเช่นนั้นได้ เมื่อเรา mount แผ่น DVD ไปที่ folder หนึ่ง และสร้าง Linux Repo ที่อ้างอิงถึง folder นั้น
command ข้างต้นคือการ mount DVD ไปที่ folder /media หลังจากนั้นสร้าง repo file ขึ้นมา โดยอ้างอิงไปถึง folder /media นั้น แล้วจะสามารถใช้งานคำสั่ง yum เพื่อ install package จากแผ่น DVD ได้
ข้อควรระวัง
จากตัวอย่างเป็น RedHat Enterprise Linux 8 ซึ่งโดยปกติ แผ่น Installer นี้จะแยก Repo เป็นสองส่วน คือส่วน package ของ BaseOS และส่วน package ของ AppStream จึงต้องสร้าง 1 Repo file ซึ่งประกอบด้วย 2 section และอ้างอิง baseurl ไปคนละ subfolder แทน
หากเป็น OS ชนิดอื่น ก็จะ config ด้วย content ที่ต่างออกไป แต่ยังคง pattern ส่วนต่างๆคล้ายเดิม คือมีส่วนหัว section [...], name, enabled, baseurl, gpgkey และ gpgcheck เป็นต้น
เมื่อใช้งานเสร็จก็ลบ Repo file นี้ทิ้ง และ unmount แผ่น DVD ออก
2021-10-26 - การทดสอบ port ด้วย /dev/tcp บน Bash
ในบางครั้ง เครื่อง server อาจจะไม่ได้ติดตั้งโปรแกรม telnet หรือ netcat (nc) มา ทำให้เราไม่สามารถตรวจสอบว่าเครื่อง remote ปลายทาง มี port ที่เราสงสัยเปิดอยู่หรือไม่
เราสามารถใช้ Bash ในการทดสอบเปิด port แทนได้ ด้วย pattern ดังนี้
โดย host สามารถเป็น ip หรือ FQDN ก็ได้
ตัวอย่างเช่น
จะเป็นการเชื่อมต่อไปยัง time.nist.gov port 13 (Daytime Protocol) ถ้าได้ exit code เป็น 0 หมายถึง port เปิดอยู่ สามารถ connect ได้สำเร็จ
ถ้าทดสอบกับ port ที่ไม่ได้เปิดอยู่ บางทีจะค้างและไม่ตอบกลับ (ปกติถ้าใช้ telnet จะ tcp timeout)
ดังนั้นในกรณีนี้ เราอาจจะต้อง implement timeout เอง ดังนี้
จะได้ exit code เป็น non-zero สำหรับ port ที่ไม่เปิดอยู่
/dev/tcp/host/portIf host is a valid hostname or Internet address, and port is an integer port number or service name, Bash attempts to open the corresponding TCP socket.
/dev/udp/host/portIf host is a valid hostname or Internet address, and port is an integer port number or service name, Bash attempts to open the corresponding UDP socket.
Reference: Bash Manual
2021-10-27 - SSH tunneling
SSH tunneling หรือ SSH port forwarding เป็นการเปิด Tunnel port อื่น ให้ network วิ่งผ่านท่อของ SSH
มักจะถูกใช้เป็น backdoor ของ IT Admin หรือโดย Hacker เพื่อเปิด Network จากภายในองค์กรออกไปยังภายนอก
นับเป็นช่องโหว่ความปลอดภัยอย่างหนึ่ง ดังนั้นไม่ควรมีช่องทางเช่นนี้ภายในองค์กร
มีวิธีทำด้วยกันหลายชนิด
Local Port Forwarding
เป็นการเปิด port จากเครื่อง client ของเรา เชื่อมไปยัง host และ port ของเป้าหมายที่ระบุ ผ่านการเรียกของ server ที่เรา SSH ไป
คำสั่งมี syntax ดังนี้
local_ip คือ ip ฝั่ง client กรณีมีหลาย network interface และอยากให้ bind เฉพาะ ip
local_port คือ port ที่จะเปิดให้ listen บน ฝั่ง client
destination คือ ปลายทางที่ request เราจะส่งไป
destination_port คือ port ปลายทางที่รับ network packet
ssh_user คือ user ที่เรา SSH ไป
ssh_server คือ server กลางที่เราใช้ในการทำ tunnel
ตัวอย่างการใช้งาน เช่น security team ป้องกันไว้ว่า ไม่ให้ dev team เข้าถึง database port ของ server ได้ และให้เพียง user account ธรรมดาของ server ซึ่งไม่มีสิทธิ์ escalate สิทธิ์ไปเป็น root account และไม่มี mysql client บน server นั้น แต่ security team ลืม และไม่ได้ป้องกัน Local Port Forwarding ไว้ ก็อาจเป็นช่องโหว่ได้
คำสั่งข้างต้น จะเปิด port 3306 ที่ฝั่ง client และทำ tunnel ไปบน server 172.31.5.12 โดย tunnel นั้นจะเชื่อมต่อไปยัง 127.0.0.1 ซึ่งก็คือ loopback address ของ server 172.31.5.12 นั่นเอง และเข้าไปยัง port 3306 ของเป้าหมายนั้น
dev team ก็จะสามารถ access DB ผ่าน localhost:3306 บนคอมของตัวเองได้ตราบเท่าที่ SSH ยังคงเชื่อมต่อไว้อยู่
อีก use case นึง อาจจะใช้ SSH server นั้นเป็นเครื่อง jump ออกไปอีกต่อได้ เช่น ใน private zone มีการ block outbound connection แปลกๆ อย่าง port 13 ไว้ แต่ public zone ไม่ได้ block ไว้ และ private zone มีการ allow ให้ ssh ไปยัง public zone ได้ ก็จะเป็นช่องโหว่ให้ private zone สามารถเชื่อมต่อออกไปยัง internet โดยใช้ public zone เป็นเครื่อง jump ได้
คำสั่งข้างต้น จะเปิด port 11111 ที่ฝั่ง client และทำ tunnel ไปบน server 172.31.5.12 โดย tunnel นั้นจะเชื่อมต่อไปยัง time.nist.gov port 13 ดังนั้นเมื่อฝั่ง client request เข้า localhost:11111 ก็จะเกิดการ forward request ผ่าน server 172.31.5.12 ไปยัง time.nist.gov port 13
การป้องกัน Local Port Forwarding ทำได้โดยแก้ไข Configuration บน SSH server ของเครื่องที่อาจถูกใช้เป็น jump server โดยกำหนด AllowTcpForwarding ใหเป็น no และ restart service ของ SSH server
Remote Port Forwarding
จะเป็น inverse ของ Local Port Forwarding เพราะจะเป็นการเปิด port บน Remote server แทน และทำ tunnel เพื่อเชื่อมต่อกลับมายัง port ของฝั่ง client
คำสั่งมี syntax ดังนี้
remote_ip คือ ip ฝั่ง SSH server กรณีมีหลาย network interface และอยากให้ bind เฉพาะ ip
remote_port คือ port ที่จะเปิดให้ listen บน ฝั่ง SSH server
destination คือ ปลายทางที่ request เราจะส่งไปโดยใช้ฝั่ง client เราเป็นตัวเข้าถึง
destination_port คือ port ปลายทางที่รับ network packet
ssh_user คือ user ที่เรา SSH ไป
ssh_server คือ server กลางที่เราใช้ในการทำ tunnel
ลักษณะการใช้งานจะเป็นการเปิด backdoor ทิ้งไว้ ให้จากภายนอกเข้ามาใช้งานได้โดยสะดวก
จะเป็นการ SSH ไปยัง server 18.10.142.204 และสั่งเปิด listen port 8080 เอาไว้ ซึ่ง port นั้นจะส่ง packet กลับมาฝั่ง client และ client จะ forward ต่อไปยัง 172.31.120.7 port 3306
เมื่อ port เปิดไว้ที่ฝั่ง server ก็จะทำให้ใครก็ตามที่มีสิทธิ์เข้าถึง port 8080 ของ SSH server นั้น สามารถส่ง command ไปยัง 172.31.120.7 port 3306 ผ่าน tunnel ที่สร้างขึ้นไว้ได้ และช่องทางนั้นจะยังคงอยู่จนกว่า SSH connection จะตัดไป

เราไม่สามารถกัน Remote Port Forwarding ระหว่างระบบภายในเรา ไปยัง server คนอื่นภายนอกได้ หากยังคงเปิด outbound port 22 (SSH) ไว้อยู่ ดังนั้นทางแก้คือ block port 22 ที่ออกข้างนอกทั้งหมด ยกเว้นเฉพาะเครื่องที่จำเป็นต้องใช้ และต้องมีการ config เครื่องเหล่านั้นให้ไม่ถูกใช้ทำ Remote Port Forwarding ไว้
การป้องกันไม่ให้คนอื่นใช้ server เราในการเป็น SSH server สำหรับทำ Remote Port Forwarding คือแก้ไข config ใน SSH server ให้ GatewayPorts มีค่าเป็น no จะทำให้เมื่อมีการสั่ง Remote Port Forward นั้น ตัว SSH server จะไม่รับ connection จากภายนอกเพื่อ forward ไปยัง tunnel นั้น
โดย default นั้น ค่า GatewayPorts จะมีค่าเป็น no อยู่แล้ว เว้นแต่ว่ามีการตั้งใจไป config เปิดไว้
Dynamic Port Forwarding
เป็นการใช้เครื่อง SSH server ที่เราใช้ jump นั้นเป็นเสมือน SOCKS proxy server
คำสั่งมี syntax ดังนี้
local_ip คือ ip ฝั่ง client กรณีมีหลาย network interface และอยากให้ bind เฉพาะ ip
local_port คือ port ที่จะเปิดให้ listen บน ฝั่ง client
ssh_user คือ user ที่เรา SSH ไป
ssh_server คือ server กลางที่เราใช้ในการทำ tunnel
หลังจากเปิด tunnel แล้วให้เรา config ค่า proxy ของ web browser ไปยัง localhost:port ที่ทำการเปิด tunnel ไว้
Last updated