교육청 자가진단 웹페이지 분석 (9월 말 경 업데이트[점검] 이후)

2020. 10. 4. 17:21분석/교육청 자가진단

9월 말 점검 이후 RSA key가 그대로길래 오류 수정한 줄 알았는데 API 관련하여 꽤 수정이 있었던 것 같습니다.

 

다시 분석하는겸 분석 과정도 적어보겠습니다.


학교 검색 API

학교 검색 창
학교 검색 창
변경 후 학교 검색 API
변경 후 학교 검색 API

기존에는 /school을 사용했는데 현재는 /v2/searchSchool로 변경된 것을 볼 수 있습니다.

 

업데이트 전/후 학교 검색 API
업데이트 전/후 학교 검색 API

파라미터 부분은 변한 것이 없는 것을 볼 수 있습니다.

 

eduro-hcs/PoC[school.js]: 기존 코드


로그인 API (학교, 이름, 생년월일)

업데이트 후 로그인 API
업데이트 후 로그인 API

기존 로그인 API는 loginwithschool 이였는데 /v2/findUser로 변경되었습니다.

여전히 Host는 {교육청}hcs.eduro.go.kr 입니다.

업데이트 전/후 로그인 API 파라미터
업데이트 전/후 로그인 API 파라미터

 

볼 수 있듯이 생년월일과 이름은 여전히 암호화되어있고, orgCode(학교 코드)는 평문 전송입니다.

점검 이후 API에는 loginType: school과 stdntPNo과 추가된 것도 알 수 있네요.

 

RSA 암호화는 제일 아래에서 다루겠습니다.

 

eduro-hcs/PoC[loginWithSchool.js]: 기존 코드


비밀번호 설정 여부 API

업데이트 후 비밀번호 설정 여부 API
업데이트 후 비밀번호 설정 여부 API

이 API는 업데이트 이전 checkpw와 상응합니다.

역시 /v2/hasPassword로 바뀐 것을 볼 수 있습니다.

업데이트 전후 비밀번호 설정 여부 API
업데이트 전후 비밀번호 설정 여부 API

여전히 Authorization 헤더를 사용해 사용자 확인을 하고 있습니다.

 

eduro-hcs/PoC[checkpw.js]: 기존 코드


비밀번호 검증 API

업데이트 후 비밀번호 검증 API
업데이트 후 비밀번호 검증 API

업데이트 이전 secondLogin과 상응합니다.

업데이트 전후 비밀번호 검증 API
업데이트 전후 비밀번호 검증 API

여전히 비어있는 deviceUuid와 암호화되어 전달되는 password 파라미터가 있습니다.

유저 확인도 Authorization 헤더를 사용해 하고 있습니다.

 

eduro-hcs/PoC[secondLogin.js]: 기존 코드


학생 선택 API

업데이트 후 학생 선택 API
업데이트 후 학생 선택 API

업데이트 이전 selectGroupList과 상응합니다.

업데이트 전후 학생 선택 API
업데이트 전후 학생 선택 API

파라미터는 두개 역시 비어있고, Authorization 헤더를 사용해 사용자 확인을 하고 있습니다.

 

eduro-hcs/PoC[selectGroupList.js]: 기존 코드


학생 정보 API

업데이트 후 학생 정보 API
업데이트 후 학생 정보 API

업데이트 전 userrefresh와 상응합니다.

업데이트 전후 학생 정보 API
업데이트 전후 학생 정보 API

역시 바뀐게 없습니다.

 

eduro-hcs/PoC[userrefresh.js]: 기존 코드


설문 제출 API

업데이트 후 설문 제출 API
업데이트 후 설문 제출 API

기존 API와 동일하지만, 파라미터가 몇개 추가되었습니다.

업데이트 전후 설문 API
업데이트 전후 설문 API

기존 설문 제출은 rspns[번호]로 된 응답과 deviceUuid만 있었는데 업데이트 이후 API에는 upperToken(JWT)과 upperUserNameEncpt(학생 이름, 평문 전송)이 추가되었습니다.

 

파라미터로 전달되는 JWT와 Authorization 헤더는 학생 정보 API에서 전달 받은 JWT를 넣어야 합니다.

 

eduro-hcs/PoC[registerSurvey.js]: 기존 코드


RSA Encryption

난독화된 javascript 코드를 살펴보겠습니다.

Sources 탭
Sources 탭

이전에 봤을 때 개발 스택이 Vue였습니다. app.js에 다 들어있을거 같으니 한번 살펴보겠습니다.

Vue.js > actions
Vue.js > actions

actions에 뭐가 들어있습니다.

loginWithSchool이 메서드 명인걸 보아 레거시 수정만 했나봅니다.

 

보면 R.encryption.encrypt하여 암호화하는 부분이 있는데 살펴봅시다.

The definition of encryption object.
The definition of encryption object.

어떤 Object의 encryption가 선언되는 부분입니다.

encryption 값이 S라고 하니 찾아봅시다.

 

S = w라고 위에 나와있으니 w를 보겠습니다.

w.encrypt가 메서드로써 JSEncrypt(변수 k)를 호출해 암호화를 담당하는 함수임을 알 수 있고, k.setPublicKey의 인자로 전달되는 w.privateKey가 RSA Public Key임을 알 수 있습니다.

 

저 키를 사용하여 암호화하면 됩니다.

 

RSA Public Key

30820122300d06092a864886f70d01010105000382010f003082010a0282010100f357429c22add0d547ee3e4e876f921a0114d1aaa2e6eeac6177a6a2e2565ce9593b78ea0ec1d8335a9f12356f08e99ea0c3455d849774d85f954ee68d63fc8d6526918210f28dc51aa333b0c4cdc6bf9b029d1c50b5aef5e626c9c8c9c16231c41eef530be91143627205bbbf99c2c261791d2df71e69fbc83cdc7e37c1b3df4ae71244a691c6d2a73eab7617c713e9c193484459f45adc6dd0cba1d54f1abef5b2c34dee43fc0c067ce1c140bc4f81b935c94b116cce404c5b438a0395906ff0133f5b1c6e3b2bb423c6c350376eb4939f44461164195acc51ef44a34d4100f6a837e3473e3ce2e16cedbe67ca48da301f64fc4240b878c9cc6b3d30c316b50203010001

기존 RSA Public Key
기존 RSA Public Key

기존의 Key와 동일합니다.

 

여담으로 위 키를 일반 인증서 형태로 뽑으려면 openssl을 사용해 hex 형태인 키를 der -> pem으로 변환시키면 됩니다.

OpenSSL을 사용하여 hex 형태 키를 pem으로 변환하는 과정
OpenSSL을 사용하여 hex 형태 키를 pem으로 변환하는 과정


아무튼 위 과정을 걸쳐서 아래 글에서는 매크로 스크립트 및 자동화 어플리케이션을 개발해보았습니다.

nnnlog.tistory.com/19

 

자가진단 매크로 스크립트 만들어보기

nnnlog.tistory.com/18 교육청 자가진단 웹페이지 분석 (9월 말 경 업데이트[점검] 이후) 9월 말 점검 이후 RSA key가 그대로길래 오류 수정한 줄 알았는데 API 관련하여 꽤 수정이 있었던 것 같습니다. 다��

nnnlog.tistory.com