0x00前言和思维导图
Socks实际上是什么:实际上是提供了精彩通信的端口,在通信之前双方都必须要创造一个端点才能通信,其实感觉socket跟计算机的三次握手有些相似,分为三个步骤:
(1)服务器监听:服务器不知道下一个客户端的具体套接字,而是处于等待连接的状态
(2)客户端请求:由客户端的套接字提出请求,连接目标是服务器的套接字。
(3)连接确认:服务器接收到客户端的套接字请求,它就响应客户端的请求,创建一个新的线程把服务器套接字的具体描述发个客户端,客户端确认以后,这个连接就建立好了,服务端继续进入监听状态。
0x01socks的编程
0x1客户端的编写
(1)首先是Socket类的构造方法public Socket(String host, int port)
,前面是你连接的服务端的ip,后面是连接端口。
(2)socketlei下面的成员方法
getInputStream()
返回此套接字的输入流
getOutputStream()
返回此套接字的输出流
void bind(SocketAddress bindpoint)
将套接字绑定到本地地址。
void close()
关闭此套接字。
void connect(SocketAddress endpoint)
将此套接字连接到服务器。
(3)一些方法的使用,传输数据
a.outputstream.write(\"数据\".getbytes())
需要把类型转化成字节类型看一看它的源码public void write(byte b[])
b.可以利用另一个类去完成PrintWriter : 高级输出流
c.PrintWriter pw3 = new PrintWriter(socket.getOutputStream());
发送给服务器或者客户端
d.Scanner scan3 = new Scanner(socket.getInputStream())
网络通信里面去读取对方发给我的信息
e.用缓冲流去接受信息
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
class Mysocks_test1{
public static void main(String[] args) {
try {
Socket socket=new Socket(\"127.0.0.1\",9099);
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write(\"客户端发送信息\");
pw.flush();
socket.shutdownOutput();
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));//按照字符流读取,缓冲流
String info=null;
while ((info= br.readLine())!=null){
System.out.println(\"我接受到的信息是\"+info);
}
br.close();
is.close();
os.close();
pw.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
0x2服务端的编写
(1)构建一个线程去接受一个客户端的请求与客户端交互
(2)InetAddress类从名字就可以看出来ip地址类,
用法:socket.getInetAddress(),获取ip地址
构造方法public InetAddress getInetAddress()返回的是一个InetAddress对象
看一下代码
点击查看代码
public class JAVA_serverSocket {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket=new Socket();
while (true){
socket=serverSocket.accept();
ServerThread thread=new ServerThread(socket);
thread.start();
InetAddress address=socket.getInetAddress();//获取客户端的IP
System.out.println(\"目标客户端的ip是\"+address);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
####0x3服务端线程
(1)构建的时候采用的是继承Thread的方法去构建的,还有两种方法(写一个类去实现接口Runnable,调用类对象)(匿名内部类)()。
(2)编写完成后一定要记得关闭所有流和socket
点击查看代码
public class ServerThread extends Thread{
private Socket socket=null;
public ServerThread(Socket socket){
this.socket=socket;
}
@Override
public void run() {
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os=null;
PrintWriter pw=null;
try {
is=socket.getInputStream();
isr=new InputStreamReader(is);
br=new BufferedReader(isr);
String info=null;
while ((info= br.readLine())!=null);{
System.out.println(\"我是服务,客户机说\"+br.readLine());
}
socket.shutdownInput();
os=socket.getOutputStream();
pw=new PrintWriter(os);
pw.write(\"服务器欢迎你\");
} catch (IOException e) {
e.printStackTrace();
}finally {
try{
if (pw != null) {
pw.close();
if (os != null) {
os.close();
} }
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
的编写
###0x02总结
这里只写了一个专业的两个客户端,其实还有很多改进的地方可以通过代理词去进行会话管理,还没有进行一下手动的输入信息,和发送过去的数据可以当做cmd的指令来执行,这个东西可能给以后的shell获取有关
学习一点免杀和shell设计之后再来继续深入
其他要用于payload的发送,还有就是写一些内网探测的脚本,但是这些在python上面已经写好了大部分的工具了,以后可能做系统的软件开发的话可能会用到
socket就先告别一个段落把
来源:https://www.cnblogs.com/0x3e-time/p/16176866.html
本站部分图文来源于网络,如有侵权请联系删除。