오늘은, ssh랑 telnet에 대해서 간단하게 와이어 샤크를 가지고 실습해 보도록 하겠습니다. 이들이 패킷을 어떻게 날리는지도 보도록 하고요. telnet이 보안이 취약하다는 소리는 많이 들어봤는데, 정말 그런건지도 한 번 보도록 하겠습니다.

 


 저는, VM 안에 있는 ubuntu에 ssh server랑 (sshd), telnet server를 깔았습니다. 그리고 window에 ssh와 telnet 클라이언트가 있습니다. 먼저, hostname -I를 쳐 보겠습니다.

 

 

 그러면, VM으로 띄운 우분투의 IP가 나올 겁니다. 그리고 방화벽 ufw가 있는데요. 이들의 설정을 건드려가면서, telnet이나, ssh 접속을 할 때 어떠한 패킷이 왔다갔다 하는지 테스트 해 볼 겁니다.

 

 

 먼저, status를 보겠습니다. 그러면, 22와 23이 Deny가 되어있음을 알 수 있습니다.

 

 

 이제 sudo ufw allow 23을 입력해 보겠습니다. 그러면 23번 포트를 허용한다는 의미입니다.

 

 

 와이어 샤크에는, 필터링을 걸 수 있는데요. ip.addr = 192,168.213.128의 의미는 ip 주소가 192.168.213.128인 (Source나 destination) 것만 필터링해서 보여주겠다는 의미입니다.

 

 

 일단, 클라이언트에서 서버로 무언가를 보내고, 서버가 응답한 다음에, 다시 클라이언트에서 서버로 ACK를 보냅니다. 여기까지는 별 게 없어 보입니다.

 

 

 패킷들을 하나 하나 보겠습니다. Telnet의 Data 부분만 보시면 됩니다.

 

 

 그러면 'o'가 보입니다. 제가 ch를 친 상태에서 'o'를 쳤을 때 클라이언트로부터 server에 'o'라는 데이터가 보내졌습니다.

 

 

 ls -ail 명령어를 치고 엔터를 친 후에, 어느 패킷을 뜯어본 것입니다. 출력되는 내용들이 모두 평문으로 전송되고 있다는 것을 알 수 있습니다.

 

 


 그러면, ssh는 어떻게 동작할까요?

 

 

 22번 포트를 allow 시킨 다음에, ssh 통신을 해 보겠습니다. 간단하게 로그인을 하고, ls -ail 명령어를 입력한 다음에 exit를 해서 종료합니다.

 

 

 일단 이 과정은 telnet과 별 차이가 없어 보입니다.

 

 

 그런데, 그 다음 전처리가 생각보다 많아 보입니다. 보아하니, SSH에 관한 정보를 주고 받고, Key Exchange에 관한 정보를 받고, 키 교환을 하는 것으로 보입니다. 암호화를 어떻게 할 것인지 (서로 합의를 하고), 키가 맞는지, 이런 것들을 사전에 확인하는 듯 싶어요. 다음에 l만 입력해 보겠습니다.

 

 

 그러면, SSHv2로 통신을 한 다음에, TCP로 통신을 하는 것을 볼 수 있는데요. 클라에서 서버로, 다시 서버에서 클라로 data를 전송하고 받는 것은 패킷을 암호화 하고, ACK 응답은 암호화 하지 않고 보냈다는 것을 유추할 수 있어요. 위 그림은 l이라는 것을 보냈을 때, 암호화된 패킷을 나타냅니다.

 

 그리고 아래의 3개 그림도 마찬가지로 I라는 것만 보냈을 때, 암호화된 패킷을 나타냅니다. 

 

 

 2a a6 c2 86 a3 ... 아까와는 다른 듯 싶군요.

 

 

 27 2f 4e 42 23 ... 2번째 그림과는 다른 듯 싶습니다.

 

 

 99 3e 8c f8 eb 20 ... 3번째와는 다른 듯 싶습니다. 추가적인 처리 (ex. salting)가 들어가는지는 모르겠지만, 확실한 것은 패킷이 암호화가 되어서 전달된다는 것입니다.

 

 

 telnet과 ssh가 패킷을 어떤 식으로 보내는지 확인을 했으니, 이 둘을 막아놓아야 겠습니다. 22번 포트를 deny하려면 위와 같이 입력하시면 됩니다.