Today I Learned

최지웅·2023년 10월 10일
0

Today I Learned

목록 보기
16/238

오늘 할일
1. 학습공동체 문제제작 및 공부
2. 운영체제 공부 끝
4. 자바공부 1시간
5. 고급 웹 프로그래밍 공부 시작

오늘 한일
3. 데이터통신 질의
3-1. 4주차 p.20 Sliding Windows흐름제어 기법에서 그림이 잘 이해가 안됐는데, 문제는 RR3과 RR4 signiture오해에 있었다. 처음 F0~F2을 받고 보내는 RR3의 이해는 0~2index까지 잘 받았고 다음에 index 3으로 보내면 된다는 의미미다. 그리고 F3을 받고 RR4 signigure를 보냈을 때 0~3까지 잘 받았고 4 index로 보내면 된다는 의미를 4개의 데이터를 수신했다 라는 의미로 잘못 이해하였다. 문제는 그 다음 그림이 이젠 이해가 안되는데, 그 후의 로직을 대충 생략하여 표현한 것 같다만 다시 물어봐야겠다. 우선 Source system A의 윈도우 조작은 이해가 간다. 4개의 데이터를 보내서 slide의 좌측 부분을 4개 줄인 다음, RR4를 받고 우측으로 1개 늘렸다. 문제는 Destination system B의 그림인데, 이미 윈도우가 꽉 차있는 상태에서 데이터를 4개 수신하였는데, 응답으로 RR4을 전달했기에 전체 윈도우 7인 상태로 우측으로 shift1개가 된 상태이다.
즉, 윈도우가 다 찬상태에서 4개의 데이터가 수신됐고 그중 1개만 처리되어 윈도우가 1만큼만 shift된 것이다. 문제는 다음그림에서 갑자기 좌측 윈도우가 3개 줄어들었는데 그림에서는 RR7신호를 발생하지 않았다. 만약 그림이 잘못되지 않았다면 Source system A는 데이터 전송 시 좌측 윈도우를 조작하고 RR신호를 받고 우측 윈도우를 조작한다. Destination system B는 데이터를 전달받으면 좌측 윈도우를 조작하고, RR신호를 보내며 우측 윈도우를 조작한다. 이제야 이해가 된다!
질의를 하며 파생된 또다른 궁금증은 윈도우 조작 방식에 대한 불완전한 이해에 있었다.
Source system A는 데이터 전송과 동시에 좌측 윈도우를 조작하고, Destination system B는 데이터 수신과 동시에 좌측 윈도우를 조작한다. Destination system B는 RR신호를 보내며 우측 윈도우를 조작하고, Source system A는 RR신호를 받으면 우측 윈도우를 조작한다. 즉 데이터 송수신시에는 좌측 윈도우를 조작하고 RR신호로 제대로 전송됌을 확인하며 우측 윈도우를 조작하는 것이다.
문제가 된 RR3신호 이후 4개의 데이터를 전송하고 RR4신호를 보내는 부분에서는 Destination system B에서 4개의 데이터를 받았을 때 RR4를 보내 1개에 데이터에 대해서 그림으로 우선 나타내고(좌측윈도우++, 우측윈도우++) 나머지 3개의 데이터를 받았을 때의 상태를 그림으로 추가적으로 나타낸 것이다.

3-2. 5주차 p.19에 MAC계층 토큰링을 설명하는 그림에서 원형으로 t=0(A begins frame), t=90(return of first bit), t=210(return of header), t=400(last bit enters ring, reinsert token)으로 그림설명이 돼있는 부분이 있는데 의미를 몰라 물어봤다.
t=0은 데이터의 전송 시작을, t=90은 데이터가 한바퀴 돌아 처음 노드인 A에 도착하기 시작한 시점을, t=210은 A에 헤더가 모두 전달된 시점을, t=400은 마지막 비트까지 다 전달이 되서 다시 토큰을 삽입하는 시점을 의미한다고 한다.
즉, 그냥 A관점에서 데이터가 처리되는 시점을 상징적으로 표현한 그림이다.

3-3. 6주차 p.19에 Packet Size 별 octets-times을 비교하는 부분에서 packet사이즈가 클 때 직렬적으로 수행되는 반면, packet사이즈가 작을 때 병렬적으로 수행되는 그림이 이해가 안됐었다. 보니까 X->a->b->Y X에서 Y까지 라우터 a와 b를 거쳐가는 모습을 그린 그림인데, 패킷이 클 경우 X->a가 끝나야 a->b가 가능한 반면 패킷이 작을 경우 두번째 패킷이 X->a로 전달될 때 첫번째 패킷을 a->b로 보내고 있는게 가능하기에 병렬적으로 그림에 표현한 것이었다.

6. pay1oad 랜섬웨어에 키전달용 코드구현
텔레그램을 이용하여 키를 전달하기로 했다. telegram bot을 만들고 해당 토큰와 채팅방 아이디를 python-telegram-bot모듈에 전달하여 파이썬 코드 내 메시지 송신이 가능해졌다. 현재는 송수신 가능성만 확인한 것이고 실질적인 키 저장은 ECC방식으로 따로 암호화하여 저장했는데, 해당 작업을 수행하는 saveKey()메서드를 어떻게 수정하면 좋을지 추후 생각해보면 좋을 듯 하다.
추가적으로 일반적인 예제코드인 bot.sendMessage(chat_id, message); 시 오류가 발생했는데, 이는 텔레그램 API업데이트로 봇이 코루틴으로 작동되기에 async 함수로 감싼 후 asynico.run()으로 감싸 작동시켜야 한다.

8. spring boot프로젝트 자체해킹시도해보기
최근 모종의 퀴즈 싸이트의 js를 조작하여 별도의 값확인 없이 정답처리되어 실제 제출한 응답들의 정답 유사도(flag)를 얻어낸 경험이 있어서 현재 개강하며 개발에 소홀하지만 만들고있는 JAVA springboot기반 프로젝트를 같은 방식으로 접근해보려고 시도했다. (일종의 XSS)

위처럼 회원 목록을 볼 수 있는 페이지에서 개발자 모드를 사용해 로직을 분석해보았다.
1. 우선 기본 html소스를 보니 항목들의 값이 그대로 td태그 형태로 들어가있었다. 또한 연결된 js역시 보이지 않았다.
2. 개발자 모드를 이용해 source를 보았는데, js파일 자체가 없이 고로 이미지와 디자인에 사용된 css, html파일이 전부였다.
3. 다른 화면에서는 약간의 js파일이 보이긴 했지만, 다른 api를 이용하거나 디자인 템플릿에 사용된 js파일, ajax에 사용된 파일이 전부였다. ajax코드는 별도의 데이터나 사용하는 상황에 대한 정보가 아닌 <script src=>로 추가된 jquery기본 코드뿐이었다.
4. 회원가입 로직에서 null값을 넣어봤더니 내부 debugging페이지가 노출되었다.

알기로 실제 런칭 시 에러가 발생했을 때 표시되는 디버깅 메시지의 수준을 조절할 수 있다고 알고있어서 해당 부분은 어떻게 조작하는지 알아보고 적용시키면 좋을 듯 하다.
우선 src에 errors폴더를 만들어 조작하는 방법, ErrorController를 implements하여 CustomErrorController를 제작하는 방법, @RequestMapping(value="/error")로의 매핑을 따로 처리하는 방법, properties(server-error-include-exception)등을 조작하는 방법이 있다.
5. 추가적으로 찾아보니 SpringBoots기반 해킹 방지에 SQLInjection시도 시 protectSQLInjection메서드에서 에러를 발생시키고, SpringSecurity의 BCrypt모듈등을 이용한 암호화 후 데이터 저장, 클라리언트의 쿠키를 XSS로 띄우는 것은 가능하나 mustache 문법으로 방어가 가능하다고 하는데 이는 처음듣는 개념이라 더 알아봐야 겠다.. 간단하게 알아보니 템플릿 엔진의 일종으로 타 엔진보다 가벼우며 비지니스 로직을 사용할 수 없어 view의 역활과 서버의 역활을 명확하게 구분지을 수 있다고 한다.

결론: js로 처리되는 로직이 있다면 해당 코드를 수정하여 다른 정보에 접근해보려 했는데 js자체가 없었다.

깨달은 점: 최근에 ajax나 react를 조금 공부하며 MVC패턴만을 이용하는 방법과 다른 방법과의 차이가 궁금했었는데, 타임리프를 이용한 MVC패턴으로만 웹서비스를 구성하는 것도 좋은 방법일 것 같다. 자세한 것은 더 찾아봐야겠지만 변수이름이나 처리되는 js코드가 노출되지 않는다는 점에서 좋은 것 같다. 가볍게 시도만 해보려했는데 생각보다 길어지며 매가리가 좀 없어지긴 한 것 같다.. 좀 더 보안이던 springboots던 공부한 후 다시 다뤄봐야겠다.

7. pay1oad 팀회의
모든 디스크를 암호화하는 현재 코드는 시스템파일까지 암호화 해버리고 그럼 복호화를 못한다.
어느 시점에 해커와 클라이언트의 개인키를 만들고, 어느 시점에 해커와 클라이언트 공개키를 넘길것이냐. 플로우차트를 그려봐라
키만 전달하는 것 말고 원본 파일을 전달하는 로직도 찾아보라
암호화하는데 30초정도면 오래걸리는 것이니 암호화 시간을 빠르게 하는 방법을 생각해보되, .py와 .exe의 실행속도부터 비교해보라
실제 가상머신에서 모든 디스크 대상으로 돌려보자
휴지통 같이 쓸데 없이 큰 파일, 시스템 파일을 별도의 암호화 제외 리스트로 만들어서 배제하자

profile
이제 3학년..

0개의 댓글