본문 바로가기

자료

네이버 로그인 소스코드

728x90

누가봐도 POST요청에, path가 "nidlogin.login"입니다. 이게 실질적인 로그인 요청일것같군요.

어떤 요청인데, "encpw"와 bvsd.encData 라는 암호화된 부분이 보입니다. (오른쪽 부분을 짤랐습니다. 이걸가지고 누가 뭘할지 알아.)

어떤 데이터가 들어가는지, 암호화를 어떻게 하는지 알아내야겠네요.

먼저 긴 "bvsd" 라는 데이터가 있으니, F12 -> 디버거에서 찾아봅시다.

bvsd.f 라는 함수에서 데이터를 설정해줍니다.

encpw 라는 데이터도 위 요청에 있었는데, 그부분도 나와있습니다.

RSA 암호화이고, 생각보다 간단하게 암호화 합니다.

encpw 라는 데이터에 실제 ID, PW가 암호화 되어 들어가고,

bvsd는 더 분석해야한다는 결과를 얻었습니다.

bvsd는 이렇습니다. 머리가 복잡해지니 RSA 암호화부터 다시 봐봅시다.

evalue, nvalue가 KEY인데, 어디서 얻어오는지 알아내야겠습니다.

다시 소스코드로 돌아와 검색해봅니다.

keySplit이라는 함수에서 정의합니다. 어디서 이 함수를 호출할까요?

위에 bvsd와 암호화된 encpw를 설정할때 이 함수를 호출했습니다. 인자는 session_keys였네요.

session_keys를 검색해봅니다.

이 함수는 어디서 호출할까요?

dynamickey? 또 검색해봅시다.

여기서 잠깐, 예상을 해봅시다.

element를 가져오고 있습니다. (현재 사이트는 로그인창입니다.)

여기서 dynamicKey를 설정해주니, 분명 로그인창에 dynamicKey가 있을것입니다.

있네요? 제 생각에는 이 키를 이 페이지에서 설정해주는것 같습니다.

네트워크탭애서 로그인창 요청을 보니 이 키값을 설정해서 줍니다.

encpw값은 RSA로 암호화된다.

- RSA키값은 https://nid.naver.com/dynamicKey/${DYNAMICKEY} 주소로 요청해 받는다.

위 사항을 알아냈습니다. 이제 bvsd를 한번 봅시다.

https://nid.naver.com/login/js/bvsd.1.3.9.min.js 의 소스코드를 가져와서 encData를 검색했습니다.

데이터가 compressToEncodeURIComponent함수의 결과값입니다.

compressToEncodeURIComponent함수를 분석해보니, 외계어입니다.

이럴때는 구글링을 해봅시다. 네이버 로그인을 한명도 분석을 안했을까요?

구글링 해보니 아래 모듈의 함수랍니다. 깔아서 decompress해보죠.

https://github.com/pieroxy/lz-string

제대로된 데이터값이 나오네요. 확실히 맞나봅니다.

근데 이거이거... 너무 복잡합니다. 데이터가 뭐야 이게..

그래도 한번 봤습니다.

데이터는 JSON 객체이고, 사용자 입력에 따라 데이터가 달라집니다.

우리는 귀찮으니 일부 데이터만 변경해줄겁니다

Object.a = UUID

Object.b = bvsd Version

Object.d[0].b.a[0] = "0,{LOGINID}";

Object.d[0].d = LOGINID;

이정도입니다. 이제 코딩을 해주면 됩니다.

POC

import axios from "axios"; import { readFileSync } from "fs"; import { compressToEncodedURIComponent } from "lz-string"; import NodeRSA = require("node-rsa"); import { stringify } from "querystring"; import { v4 } from "uuid"; async function getRSA(): Promise<{ rsa: NodeRSA; sessionKey: string; keyName: string; dynamicKey: string; }> { const loginPageRes = await axios("https://nid.naver.com/nidlogin.login"); const dynamicKey = loginPageRes.data.match(/id="dynamicKey" value="(.*)"/)[1]; const rsaKeyRes = await axios("https://nid.naver.com/dynamicKey/" + dynamicKey); const keys = rsaKeyRes.data.split(","); const sessionKey = keys[0]; const keyName = keys[1]; const nvalue = keys[2]; const evalue = keys[3]; const nodeRSA = new NodeRSA(); nodeRSA.importKey( { n: Buffer.from(nvalue, "hex"), e: Buffer.from(evalue, "hex") }, "components-public" ); nodeRSA.setOptions({ encryptionScheme: "pkcs1" }); return { rsa: nodeRSA, sessionKey, keyName, dynamicKey }; } function getBvsdData(loginId: string): { uuid: string; encData: string; } { const uuid = v4() + "-0"; const bvsdData = JSON.parse(readFileSync("./bvsd.json", "utf-8")); bvsdData.a = uuid; bvsdData.d[0].b.a[0] = "0," + loginId; bvsdData.d[0].d = loginId; const bvsd = compressToEncodedURIComponent(JSON.stringify(bvsdData)); return { uuid, encData: bvsd }; } function getEncryptedData( rsaInfo: { rsa: NodeRSA; sessionKey: string; keyName: string; dynamicKey: string; }, loginId: string, loginPassword: string ): string { const getLenChar = (str: string) => String.fromCharCode(str.length); const encrypted = rsaInfo.rsa.encrypt(getLenChar(rsaInfo.sessionKey) + rsaInfo.sessionKey + getLenChar(loginId) + loginId + getLenChar(loginPassword) + loginPassword, "hex"); return encrypted; } async function login(loginId: string, loginPassword: string) { const rsaInfo = await getRSA(); const bvsdData = getBvsdData(loginId); const encryptedData = getEncryptedData(rsaInfo, loginId, loginPassword); const loginRes = await axios.post( "https://nid.naver.com/nidlogin.login", stringify({ localechange: "", dynamicKey: rsaInfo.dynamicKey, encpw: encryptedData, enctp: "1", svctype: "1", smart_LEVEL: "1", bvsd: JSON.stringify(bvsdData), encnm: rsaInfo.keyName, locale: "ko_KR", url: "https://www.naver.com", id: "", pw: "", privateMode: "true" }) ); console.log(loginRes.data); }

BVSD DATA

{"a":"","b":"1.3.9","c":false,"d":[{"i":"id","a":["0,d,ALT,18"],"b":{"a":[],"b":0},"c":"","d":"","e":false,"f":false},{"i":"pw","a":[],"b":{"a":["0,"],"b":0},"c":"","d":"","e":true,"f":false}],"e":{"a":{"a":999,"b":999,"c":999},"b":{"a":999,"b":999,"c":999}},"f":{"a":{"a":{"a":999,"b":999,"c":999},"b":{"a":999,"b":999,"c":999}},"b":{"a":{"a":999,"b":999,"c":999},"b":{"a":999,"b":999,"c":999}}},"g":{"a":["0|7|-2|-1","0|8|-2|-1","0|7|-2|0","0|7|-1|-1","0|6|0|-1","1|0|0|0","2|112|0|0","0|119|-1|0","0|12|-1|0","0|3|-1|1","0|6|-1|1","0|293|-222|58","0|3|-11|0","0|8|-19|-1","0|6|-14|0","0|8|-16|0","0|7|-18|-1","0|6|-16|-1","0|7|-15|0","0|8|-15|0","0|6|-16|0","0|7|-15|0","0|7|-13|-1","0|7|-16|-1","0|7|-15|-1","0|7|-15|0","0|7|-13|-1","0|6|-14|-2","0|7|-12|-1","0|8|-14|-1","0|6|-9|-2","0|7|-11|0","0|7|-9|-2","0|7|-7|0","0|8|-7|-1","0|6|-8|-1","0|7|-5|0","0|7|-7|0","0|7|-4|-1","0|7|-6|0","0|7|-6|-1","0|7|-4|-1","0|7|-5|-1","0|7|-5|-2","0|6|-6|-2","0|7|-5|-2","0|8|-5|-2","0|6|-6|-2","0|8|-5|-2","0|7|-6|-2","0|7|-4|-3","0|6|-5|-3","0|8|-4|-5","0|6|-3|-6","0|7|-1|-6","0|8|-2|-7","0|7|0|-5","0|7|1|-6","0|6|3|-4","0|7|3|-4","0|7|3|-4","0|7|4|-4","0|7|2|-3","0|6|2|-2","0|7|2|-4","0|7|2|-3","0|8|1|-2","0|7|2|-2","0|6|2|-1","0|7|3|-2","0|7|3|0","0|234|0|1","0|6|1|0","0|5|0|1","0|5|1|0","1|8|0|0","0|7|1|1","0|12|1|0","2|79|0|0","0|180|-1|0","0|6|-1|0","0|7|-3|0","0|7|-2|0","0|7|-5|0","0|7|-4|-2","0|7|-5|-2","0|7|-5|-2","0|7|-4|-2","0|7|-6|-3","0|6|-4|-2","0|8|-3|-2","0|7|-5|-3","0|7|-4|-2","0|6|-4|-2","0|8|-3|-2","0|7|-4|-3","0|7|-4|-2","0|6|-3|-3","0|7|-3|-1","0|7|-3|-2","0|7|-3|-3","0|7|-2|-2","0|7|-2|-2","0|7|-3|-3","0|6|-2|-2","0|8|-1|-2","0|7|-3|-3","0|7|-3|-2","0|6|-1|-3","0|7|-1|-1","0|8|0|-1","0|6|0|-1","0|9818|370|85","0|4|1|0","0|5|0|1","0|14|1|2","0|6|0|1","0|7|2|1","0|7|0|2","0|45696|-70|116","0|5|9|-32","0|7|8|-40","0|6|9|-37","0|8|7|-40","0|7|7|-38","0|6|6|-33","0|8|7|-34","0|7|5|-25","0|6|4|-28","0|7|5|-33","0|8|4|-25","0|4|2|-20","0|66048|95|362","0|6|5|2","0|7|7|4","0|7|8|4","0|6|9|5","0|7|10|4","0|8|12|5","0|7|13|5","0|6|13|5","0|7|15|7","0|7|16|6","0|7|8|2","0|7|25|9","0|7|20|7","0|7|17|6","0|7|20|7","0|7|16|6","0|7|17|6","0|7|15|6","0|7|10|4","0|7|11|6","0|6|6|4","0|8|6|4","0|6|3|4","0|8|2|4","0|6|1|3","0|7|0|4","0|7|0|3","0|7|-1|3","0|7|-3|2","0|7|-2|2","0|7|-3|2","0|6|-4|2","0|8|-3|1","0|7|-5|1","0|7|-4|0","0|7|-4|0","0|7|-5|0","0|7|-5|0","0|7|-5|-1","0|7|-4|-1","0|6|-4|-2","0|7|-3|-2","0|8|-3|-3","0|7|-2|-2","0|6|-2|-2","0|7|-1|-2","0|7|-2|-3","0|7|-2|-3","0|7|-2|-3","0|7|-1|-3","0|7|-1|-4","0|7|-1|-3","0|7|-2|-4","0|6|-1|-3","0|7|0|-3","0|8|-2|-2","0|7|0|-2","0|6|-1|-2","0|7|-1|-2","0|7|-1|-2","0|8|-1|-1","0|7|0|-1","0|6|-1|-2","0|7|0|-1","0|9|0|-1","1|41|0|0","2|81|0|0"],"b":484,"c":678,"d":449,"e":332634,"f":0},"j":96,"h":"fcf1929e5b6f2d3fdc2ce61f452d59ec","i":{"a":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0","b":"ko-KR","c":24,"d":-1,"e":1,"f":8,"g":[1920,1080],"h":[1920,1032],"i":-540,"j":1,"k":1,"l":1,"m":"unknown","n":"Win32","o":"1","aa":["PDF Viewer::Portable Document Format::application/pdf~pdf,text/pdf~pdf","Chrome PDF Viewer::Portable Document Format::application/pdf~pdf,text/pdf~pdf","Chromium PDF Viewer::Portable Document Format::application/pdf~pdf,text/pdf~pdf","Microsoft Edge PDF Viewer::Portable Document Format::application/pdf~pdf,text/pdf~pdf","WebKit built-in PDF::Portable Document Format::application/pdf~pdf,text/pdf~pdf"],"p":"70f4dabaad6fa5fc7f991a9710f8ebaf","q":"008fe9c25f21e426d1922e6cd0b4ab3d","r":"Google Inc. (Intel)~ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0)","s":false,"t":false,"u":false,"v":false,"w":false,"x":[0,false,false],"aca":"","acb":"","acc":"","acd":"","ace":"","acf":"","acg":"","ach":"","aci":"","ad":"5.0 (Windows)","ae":"true","af":"true","ak":"default|prompt","ag":"4","aj":"1292|910","ah":"false","ai":"","am":"landscape","an":"false","al":"","y":["Arial","Arial Black","Calibri","Cambria","Cambria Math","Comic Sans MS","Consolas","Courier","Courier New","Georgia","Helvetica","Impact","Lucida Console","Lucida Sans Unicode","Microsoft Sans Serif","MS Gothic","MS PGothic","MS Sans Serif","MS Serif","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Light","Segoe UI Semibold","Segoe UI Symbol","Tahoma","Times","Times New Roman","Trebuchet MS","Verdana","Wingdings"]}}
728x90

'자료' 카테고리의 다른 글

VB.NET/C# FLAT UI Theme/Form Skin  (0) 2023.07.26
Mega 할당량초과 무시 다운로드 방법 프로그램 공유  (2) 2023.07.17
CryptoJS PHP 통신  (0) 2023.03.23
JS,PHP CryptoJS  (0) 2023.03.23
winhttp.IWinHttpRequest::Option 속성  (1) 2022.11.21