본문 바로가기
해킹 공부/웹해킹

Socket.io, 소켓통신

by zzzmilky 2020. 10. 12.

학교 공부 때문에 바쁘다가 오랜만에 문제를 풀어보아따...ㅎㅎ 졸리다!!!!!!


 

58번 문제. 150점짜리

 

CMD 창 같아 보이는 창이 뜬다..? User console이라고 되어있다. 명령어를 막 입력해보았는데 다 command not found라고 뜨는데 ls 입력하면 저렇게 index.js와 temp.html이 뜬다. 그래서 그쪽으로 이동해야하는 건 줄 알고 cd 입력해보았는데 command not found라고 계속 뜬다ㅜㅜ마지막줄은 help를 입력한 결과.소스를 한번 보자...

 

 

 

socket을 이용한 통신 같았다. socket으로 한번 채팅방 만들어본 적이 있는데 Socket.io 모듈 사용하지 않고 만든 웹소켓이었다. 그래도 socket.emit은 이벤트를 보내는 것, socket.on은 이벤트를 받는 것 같았다. 그리고 submit 버튼을 누르면 이벤트를 보내고, emit 부분에 있는 m은 입력창에 넣은 값을 의미한다. username의 경우 guest이므로 이것을 admin으로 한번 고쳐보았다.

 

 

창에 permission denied....admin only라고 뜬다. 그래서 불필요한 코드를 줄이고 콘솔창에 직접 코드를 다시 짜서 실행해보았다.

 

 

socket.emit 부분만 남겨두고 원래있던 submit이나 입력창 초기화 등등은 삭제하고 바로 admin:flag가 보내지도록 했다. socket.on은 수정하지 않고 창에 flag가 나타나도록 했다. 그 결과 위에 FLAG{...}가 나왔다. 문제풀이 성공!


Socket.IO

 

 

웹소켓을 사용하기 위한 패키지는 websocket 모듈이 있는데 이것은 http 서버를 연결해야하고, ws 모듈과 Socket.IO 모듈이 있다. Socket.IO 모듈은 웹소켓을 편리하게 사용하도록 해주는 모듈이다. Socket.IO는 클라이언트 측에서 웹 소켓 연결이 끊어지면 자동으로 재연결을 시도한다.

const SocketIO = require('socket.io');

 module.exports = (server) => {
    const io = SocketIO(server, { path: '/socket.io' });
    
    io.on('connection', (socket) => { // 웹소켓 연결 시
    const req = socket.request;
    const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    console.log('새로운 클라이언트 접속!', ip, socket.id, req.ip);
    socket.on('disconnect', () => { // 연결 종료 시
    console.log('클라이언트 접속 해제', ip, socket.id);
    clearInterval(socket.interval);
    
    });

	socket.on('error', (error) => { // 에러 시
		console.error(error);
        });
	socket.on('reply', (data) => { // 클라이언트로부터 메시지
		console.log(data);
        });
        
        socket.interval = setInterval(() => { // 3초마다 클라이언트로 메시지 전송
        socket.emit('news', '안녕하세요 Socket.IO');
        }, 3000);
});
};

socket.js

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>웹 소켓 - SocketIO 이용</title>
</head>
<body>
	<div>F12를 눌러 console 탭과 network 탭을 확인하세요.</div>
	<script src="/socket.io/socket.io.js"></script>
	<script>
	const socket = io.connect('http://localhost:8001', {
		path: '/socket.io',
		transports: ['websocket'],
	});
	socket.on('news', function (data) {
		console.log(data);
		socket.emit('reply', 'Hello Node.JS');
    });
    </script>
</body>
</html>

index.html

 

 

  • Socket.IO 패키지를 불러와 익스프레스 서버와 연결한다. 두번째 인수는 클라이언트와 연결할 수 있는 경로다.
  • connection 이벤트는 서버와 연결되어 있을 때 호출하고, 콜백으로 소켓 객체를 제공한다.
  • socket.request로 요청 객체에 접근 가능하다. socket.id로 소켓 고유 아이디를 확인가능하다.
  • disconnect 이벤트는 연결 종료 시 호출하고 error은 에러발생시 호출한다.
  • reply는 사용자가 직접 만들 이벤트로 클라이언트에서 reply 이벤트 발생 시 서버에 전달된다.
  • socket.emit으로 메세지를 전달한다. 첫번째 인수는 이벤트 명이고 두번째 인수가 메시지이다.

 

댓글