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 ได้

cat > filename << EOF content EOF

คือ การเขียน content ลงไปในไฟล์ที่ชื่อ filename

เมื่อใช้งานเสร็จก็ลบ 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/port

If 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/port

If 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

มีวิธีทำด้วยกันหลายชนิด

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 ยังคงเชื่อมต่อไว้อยู่

bypass firewall block access to server port

อีก 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

bypass firewall block access to internet

การป้องกัน 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 จะตัดไป

backdoor

เราไม่สามารถกัน 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