Giter Club home page Giter Club logo

xray's Introduction

Welcome to xray 👋

Documentation

一款功能强大的安全评估工具

🏠使用文档⬇️xray下载⬇️xpoc下载⬇️xapp下载📖插件存储库

English Version

注意:xray系列不开源,直接下载构建的二进制文件即可,仓库内主要为社区贡献的 poc,每次 xray 发布将自动打包。

✨ xray2.0

为了解决 xray 1.0在功能增加过程中变得复杂且臃肿的问题,我们推出了 xray 2.0。

这一全新版本致力于提升功能使用的流畅度,降低使用门槛,并帮助更多安全行业从业者以更高效的模式收获更好的体验。xray 2.0 将整合一系列新的安全工具,形成一个全面的安全工具集。

xray2.0系列的第二款工具xapp已经上线,欢迎体验!

XPOC

xpoc是xray2.0系列的第一款工具,它是一款为供应链漏洞扫描设计的快速应急响应工具

项目地址:https://github.com/chaitin/xpoc

XAPP

xapp是一款专注于web指纹识别的工具。你可以使用xapp对web目标所使用的技术进行识别,为安全测试做好准备。

项目地址:https://github.com/chaitin/xapp

插件存储库

我们为各类插件创建了一个专门的存储库,旨在方便大家共享和使用各种插件。

这里主要收录的是开源的、转化成 xray格式的脚本,以供大家使用。

我们会不定期地往这里推送一些新的插件,同时也希望大家能积极踊跃的优化或者提交插件,共同丰富这个仓库。

项目地址:https://github.com/chaitin/xray-plugins

🚀 快速使用

在使用之前,请务必阅读并同意 License 文件中的条款,否则请勿安装使用本工具。

  1. 使用基础爬虫爬取并对爬虫爬取的链接进行漏洞扫描

    xray webscan --basic-crawler http://example.com --html-output vuln.html
  2. 使用 HTTP 代理进行被动扫描

    xray webscan --listen 127.0.0.1:7777 --html-output proxy.html

    设置浏览器 http 代理为 http://127.0.0.1:7777,就可以自动分析代理流量并扫描。

    如需扫描 https 流量,请阅读下方文档 抓取 https 流量 部分

  3. 只扫描单个 url,不使用爬虫

    xray webscan --url http://example.com/?a=b --html-output single-url.html
  4. 手动指定本次运行的插件

    默认情况下,将会启用所有内置插件,可以使用下列命令指定本次扫描启用的插件。

    xray webscan --plugins cmd-injection,sqldet --url http://example.com
    xray webscan --plugins cmd-injection,sqldet --listen 127.0.0.1:7777
  5. 指定插件输出

    可以指定将本次扫描的漏洞信息输出到某个文件中:

    xray webscan --url http://example.com/?a=b \
    --text-output result.txt --json-output result.json --html-output report.html

    报告样例

其他用法请阅读文档: https://docs.xray.cool

🪟 检测模块

新的检测模块将不断添加

名称 Key 版本 说明
XSS漏洞检测 xss 社区版 利用语义分析的方式检测XSS漏洞
SQL 注入检测 sqldet 社区版 支持报错注入、布尔注入和时间盲注等
命令/代码注入检测 cmd-injection 社区版 支持 shell 命令注入、PHP 代码执行、模板注入等
目录枚举 dirscan 社区版 检测备份文件、临时文件、debug 页面、配置文件等10余类敏感路径和文件
路径穿越检测 path-traversal 社区版 支持常见平台和编码
XML 实体注入检测 xxe 社区版 支持有回显和反连平台检测
poc 管理 phantasm 社区版 默认内置部分常用的 poc,用户可以根据需要自行构建 poc 并运行。文档:POC
文件上传检测 upload 社区版 支持常见的后端语言
弱口令检测 brute-force 社区版 社区版支持检测 HTTP 基础认证和简易表单弱口令,内置常见用户名和密码字典
jsonp 检测 jsonp 社区版 检测包含敏感信息可以被跨域读取的 jsonp 接口
ssrf 检测 ssrf 社区版 ssrf 检测模块,支持常见的绕过技术和反连平台检测
基线检查 baseline 社区版 检测低 SSL 版本、缺失的或错误添加的 http 头等
任意跳转检测 redirect 社区版 支持 HTML meta 跳转、30x 跳转等
CRLF 注入 crlf-injection 社区版 检测 HTTP 头注入,支持 query、body 等位置的参数
XStream漏洞检测 xstream 社区版 检测XStream系列漏洞
Struts2 系列漏洞检测 struts 高级版 检测目标网站是否存在Struts2系列漏洞,包括s2-016、s2-032、s2-045、s2-059、s2-061等常见漏洞
Thinkphp系列漏洞检测 thinkphp 高级版 检测ThinkPHP开发的网站的相关漏洞
shiro反序列化漏洞检测 shiro 高级版 检测Shiro反序列化漏洞
fastjson系列检测 fastjson 高级版 检测fastjson系列漏洞

⚡️ 进阶使用

下列高级用法请查看 https://docs.xray.cool/ 使用。

  • 修改配置文件
  • 抓取 https 流量
  • 修改 http 发包配置
  • 反连平台的使用
  • ...

😘 贡献 POC

xray的进步离不开各位师傅的支持,秉持着互助共建的精神,为了让我们共同进步,xray也开通了“PoC收录”的渠道!在这里你将会得到:

提交流程

  1. 贡献者以 PR 的方式向 github xray 社区仓库内提交, POC 提交位置: https://github.com/chaitin/xray/tree/master/pocs, 指纹识别脚本提交位置: https://github.com/chaitin/xray/tree/master/fingerprints
  2. PR 中根据 Pull Request 的模板填写 POC 信息
  3. 内部审核 PR,确定是否合并入仓库
  4. 但需要注意,如果想要获得POC的奖励,需要将你的POC提交到CT stack,才能获取到奖励

丰厚的奖励

  • 贡献PoC将获得丰厚的金币奖励,成就感满满;
  • 丰富的礼品兑换专区,50余种周边礼品任你挑选;
  • 定期更有京东卡上线兑换,离财富自由又近了一步;
  • 进入核心社群的机会,领取特殊任务,赚取高额赏金

完善的教程

  • 完善的PoC编写教程和指导,让你快速上手,少走弯路;

学习与交流

  • 与贡献者、开发者面对面学习交流的机会,各项能力综合提高;
  • 免笔试的直通面试机会,好工作不是梦;

如果你已经成功贡献过PoC但是还没有进群,请添加客服微信:

提供平台注册id进行验证,验证通过后即可进群!

参照: https://docs.xray.cool/#/guide/contribute

🔧周边生态

POC质量确认靶场

Evil Pot

Releases

一个专门用于让扫描器产生误报的靶场

编写插件应该尽量避免能在这个靶场扫描出结果

POC编写辅助工具

该工具可以辅助生成POC,且在线版支持poc查重,本地版支持直接发包验证

在线版

本地版

xray gui辅助工具

本工具仅是简单的命令行包装,并不是直接调用方法。在 xray 的规划中,未来会有一款真正的完善的 GUI 版 XrayPro 工具,敬请期待。

📝 讨论区

各位开发者和 xray 粉丝们,欢迎来讨论区投票,决定 xray 2.0 工具的开发优先级,让你的声音塑造 xray 的未来! 🚀

提交误报漏报需求等等请务必先阅读 https://docs.xray.cool/#/guide/feedback

如有问题可以在 GitHub 提 issue, 也可在下方的讨论组里

  1. GitHub:

  2. 微信公众号:微信扫描以下二维码,关注我们

  3. 微信群: 请添加微信公众号并点击"联系我们" -> "加群",然后扫描二维码加群

  4. QQ 群: 717365081

Star History

Star History Chart

xray's People

Contributors

993286925 avatar a3vilc0de avatar b1anda0 avatar canc3s avatar cc8ci avatar fiveaourthe avatar for3stco1d avatar harris2015 avatar imgbot[bot] avatar imp0wd3r avatar j4ckzh0u avatar jarcis-cy avatar kzaopa avatar l1nk3rlin avatar loneyers avatar maxsecurity avatar monstersb avatar nu0l avatar pa55w0rd avatar phith0n avatar print1n avatar shmilylty avatar smile-jpg avatar soveless avatar suzzz112113 avatar virusdefender avatar x1n9qi8 avatar yekkoy avatar yywing avatar zema1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xray's Issues

[reverse:server.go:178] server shutdown

如题,大量报 [reverse:server.go:178] server shutdown
或者是 request to http://www.xxxx.com/debug.txt failed, retrying (1 / 1)... 程序终止...
But,同样的网站和网络环境,换另一个工具扫,没问题,可以扫出来一些常规敏感文件。
IP也没有被拉黑,专门找了一个没有WAF的测试。
希望可以给出个可能的原因结果,个人猜测:

  1. 有可能是程序设置的默认线程并发太高?将来是否可以手动设置线程数量 ?
  2. 没有随机UA?
  3. 线程之间设置随机延迟?将来也可以手动设置延迟?

English Doc

Could someone provide English docs for it?

bind: cannot assign requested address

20190711156285309254182.jpg

这里的话,好像某些云还得配置允许监听非本机ip吧?
我这边报错。

20190711156285310369436.jpg

查阅资料,有人说是因为监听了非本机ip,需要修改服务器配置。

20190711156285311863348.jpg

是不是因为默认是直接监听的config的ip、而不是0.0.0.0?
建议如果配置公网,默认就0.0.0.0。
这两个在配置文件里也很好区分吧。(有无token)

信息泄露扫描加入Spring Actuator

路径 描述
/autoconfig 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
/beans 描述应用程序上下文里全部的Bean,以及它们的关系
/env 获取全部环境属性
/configprops 描述配置属性(包含默认值)如何注入Bean
/dump 获取线程活动的快照
/health 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
/info 获取应用程序的定制信息,这些信息由info打头的属性提供
/mappings 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系
/metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数
/shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true
/trace 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)

代理设置增强建议

  • mitm走一条线路代理,或者强制不走代理,即使设置了export http_proxy=*
  • scan流量走另外一条代理,比如export http_proxy中定义的。过waf,防止被封等需求。

配置文件配置,或者命令参数,来区分。

poc 支持指定文件夹

建议添加 --poc-dir 来使用指定目录的所有 POC, 这个选项可以和 --poc 一起使用,取合集

报错闪退

OS:macOS 10.14.5
Broswer: FireFox 68.0
xary version: 0.5.1
使用被动扫描模式:./xray webscan --listen 127.0.0.1:8888 时报错后闪退

好像是并发较高导致的,Error log如下:

fatal error: concurrent map iteration and map write

goroutine 12128 [running]:
runtime.throw(0x187c820, 0x26)
/usr/local/go/src/runtime/panic.go:617 +0x72 fp=0xc001619d18 sp=0xc001619ce8 pc=0x102cdd2
runtime.mapiternext(0xc001619e40)
/usr/local/go/src/runtime/map.go:860 +0x597 fp=0xc001619da0 sp=0xc001619d18 pc=0x100eb77
assassin/http.(*Request).clone(0xc000e55ec0, 0xc0015e0901, 0xc001e49f40)
/builds/lohengrin/assassin/http/request.go:446 +0x3be fp=0xc001619f10 sp=0xc001619da0 pc=0x15c421e
assassin/http.(*Flow).DeepClone(0xc000fa3530, 0xc001b04450, 0x29e8d60800)
/builds/lohengrin/assassin/http/resource.go:35 +0x33 fp=0xc001619f38 sp=0xc001619f10 pc=0x15c8843
assassin/controller.(*unit).run.func1(0xc001c3b590, 0x1982940, 0xc000ec67c0, 0x1982840, 0xc000fa3530)
/builds/lohengrin/assassin/controller/controller.go:39 +0xcd fp=0xc001619fb8 sp=0xc001619f38 pc=0x161a9ed
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1337 +0x1 fp=0xc001619fc0 sp=0xc001619fb8 pc=0x105be61
created by assassin/controller.(*unit).run
/builds/lohengrin/assassin/controller/controller.go:35 +0x138

goroutine 1 [select]:
assassin/utils.(*SizedWaitGroup).AddWithContext(0xc001c3b430, 0x1982940, 0xc000ec67c0, 0xc002379901, 0x1617e21)
/builds/lohengrin/assassin/utils/sync.go:34 +0xc5
assassin/controller.(*unit).run(0xc001c3b400, 0x1982940, 0xc000ec67c0, 0x1982840, 0xc000fa2180, 0x0, 0x0)
/builds/lohengrin/assassin/controller/controller.go:30 +0xc2
assassin/controller.(*SingleProcessController).Start(0xc002379c80, 0x1982940, 0xc000ec67c0, 0x10, 0x0)
/builds/lohengrin/assassin/controller/single.go:129 +0x1ef
assassin/cli.glob..func3(0xc000888120, 0x0, 0x0)
/builds/lohengrin/assassin/cli/webscan.go:177 +0x94e
gopkg.in/urfave/cli%2ev2.(*Command).Run(0xc001213560, 0xc001233710, 0x0, 0x0)
/go/pkg/mod/gopkg.in/urfave/[email protected]/command.go:167 +0x6c5
gopkg.in/urfave/cli%2ev2.(*App).Run(0xc00126c000, 0xc0000ae000, 0x4, 0x4, 0x0, 0x0)
/go/pkg/mod/gopkg.in/urfave/[email protected]/app.go:261 +0x661
main.main()
/builds/lohengrin/assassin/main.go:132 +0x21f

goroutine 18 [chan receive]:
github.com/panjf2000/ants.(*Pool).periodicallyPurge(0xc0001e0150)
/go/pkg/mod/github.com/panjf2000/[email protected]/pool.go:71 +0x212
created by github.com/panjf2000/ants.NewTimingPool
/go/pkg/mod/github.com/panjf2000/[email protected]/pool.go:116 +0xc5

goroutine 49 [syscall, 2 minutes]:
os/signal.signal_recv(0x0)
/usr/local/go/src/runtime/sigqueue.go:139 +0x9f
os/signal.loop()
/usr/local/go/src/os/signal/signal_unix.go:23 +0x22
created by os/signal.init.0
/usr/local/go/src/os/signal/signal_unix.go:29 +0x41

goroutine 81 [chan receive, 2 minutes]:
assassin/cli/ctx.WithSignal.func1(0xc0013363f0, 0xc001804120)
/builds/lohengrin/assassin/cli/ctx/ctx.go:44 +0xee
created by assassin/cli/ctx.WithSignal
/builds/lohengrin/assassin/cli/ctx/ctx.go:39 +0x1b0

goroutine 10 [select]:
assassin/collector.(*mitmProxy).FitOut.func1(0x1982940, 0xc000ec67c0, 0xc0018ea4e0)
/builds/lohengrin/assassin/collector/mitm.go:126 +0xe3
created by assassin/collector.(*mitmProxy).FitOut
/builds/lohengrin/assassin/collector/mitm.go:122 +0x8f

goroutine 83 [IO wait, 2 minutes]:
internal/poll.runtime_pollWait(0x277aba0, 0x72, 0x0)
/usr/local/go/src/runtime/netpoll.go:182 +0x56
internal/poll.(*pollDesc).wait(0xc00109c118, 0x72, 0x0, 0x0, 0x1862f2d)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:92
internal/poll.(*FD).Accept(0xc00109c100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:384 +0x1ba
net.(*netFD).accept(0xc00109c100, 0x17ec1c0, 0x50, 0xc000f22000)
/usr/local/go/src/net/fd_unix.go:238 +0x42
net.(*TCPListener).accept(0xc0001ee030, 0xc001358000, 0x224a6d0, 0x0)
/usr/local/go/src/net/tcpsock_posix.go:139 +0x32
net.(*TCPListener).AcceptTCP(0xc0001ee030, 0x100c0a8, 0x30, 0x17ec1c0)
/usr/local/go/src/net/tcpsock.go:247 +0x48
net/http.tcpKeepAliveListener.Accept(0xc0001ee030, 0x17ec1c0, 0xc000888330, 0x1764be0, 0x20231d0)
/usr/local/go/src/net/http/server.go:3264 +0x2f
net/http.(*Server).Serve(0xc00009a410, 0x1981380, 0xc0001ee030, 0x0, 0x0)
/usr/local/go/src/net/http/server.go:2859 +0x22d
net/http.(*Server).ListenAndServe(0xc00009a410, 0x187120d, 0x17)
/usr/local/go/src/net/http/server.go:2797 +0xe4
assassin/reverse.(*Server).Start.func1(0xc001329f40)
/builds/lohengrin/assassin/reverse/server.go:152 +0x69
created by assassin/reverse.(*Server).Start
/builds/lohengrin/assassin/reverse/server.go:150 +0x4d

goroutine 84 [chan receive, 2 minutes]:
assassin/reverse.(*Server).Start.func2(0x1982940, 0xc000ec67c0, 0xc001329f40)
/builds/lohengrin/assassin/reverse/server.go:160 +0x48
created by assassin/reverse.(*Server).Start
/builds/lohengrin/assassin/reverse/server.go:159 +0x83

goroutine 41 [chan receive]:
github.com/panjf2000/ants.(*Pool).periodicallyPurge(0xc0012640e0)
/go/pkg/mod/github.com/panjf2000/[email protected]/pool.go:71 +0x212
created by github.com/panjf2000/ants.NewTimingPool
/go/pkg/mod/github.com/panjf2000/[email protected]/pool.go:116 +0xc5

goroutine 42 [IO wait]:
internal/poll.runtime_pollWait(0x277ac70, 0x72, 0x0)
/usr/local/go/src/runtime/netpoll.go:182 +0x56
internal/poll.(*pollDesc).wait(0xc000ef2098, 0x72, 0x0, 0x0, 0x1862f2d)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:92
internal/poll.(*FD).Accept(0xc000ef2080, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:384 +0x1ba
net.(*netFD).accept(0xc000ef2080, 0xc00138ad70, 0xc09bc6b8a0, 0x2053820)
/usr/local/go/src/net/fd_unix.go:238 +0x42
net.(*TCPListener).accept(0xc000eda038, 0x1ab79bc6b8a0, 0x100000001, 0xc00138adb0)
/usr/local/go/src/net/tcpsock_posix.go:139 +0x32
net.(*TCPListener).AcceptTCP(0xc000eda038, 0xc00138add8, 0x10b4ea6, 0x5d232056)
/usr/local/go/src/net/tcpsock.go:247 +0x48
net/http.tcpKeepAliveListener.Accept(0xc000eda038, 0xc00138ae28, 0x18, 0xc0013f2600, 0x136f734)
/usr/local/go/src/net/http/server.go:3264 +0x2f
net/http.(*Server).Serve(0xc00009a9c0, 0x1981380, 0xc000eda038, 0x0, 0x0)
/usr/local/go/src/net/http/server.go:2859 +0x22d
net/http.(*Server).ListenAndServe(0xc00009a9c0, 0x1873222, 0x1a)
/usr/local/go/src/net/http/server.go:2797 +0xe4
assassin/collector.(*mitmProxy).FitOut.func3(0xc001254ab0, 0xc00009a9c0, 0xc001367560, 0xc0018ea4e0)
/builds/lohengrin/assassin/collector/mitm.go:235 +0xac
created by assassin/collector.(*mitmProxy).FitOut
/builds/lohengrin/assassin/collector/mitm.go:233 +0xebb

goroutine 43 [chan receive, 2 minutes]:
assassin/collector.(*mitmProxy).FitOut.func4(0x1982940, 0xc000ec67c0, 0xc00009a9c0, 0xc0012640e0, 0xc001367560, 0xc0018ea4e0)
/builds/lohengrin/assassin/collector/mitm.go:243 +0x4c
created by assassin/collector.(*mitmProxy).FitOut
/builds/lohengrin/assassin/collector/mitm.go:242 +0xf21

goroutine 9820 [IO wait]:
internal/poll.runtime_pollWait(0x51400d8, 0x72, 0xffffffffffffffff)
/usr/local/go/src/runtime/netpoll.go:182 +0x56
internal/poll.(*pollDesc).wait(0xc002286398, 0x72, 0x1600, 0x16a3, 0xffffffffffffffff)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:92
internal/poll.(*FD).Read(0xc002286380, 0xc001606000, 0x16a3, 0x16a3, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:169 +0x1f2
net.(*netFD).Read(0xc002286380, 0xc001606000, 0x16a3, 0x16a3, 0x203000, 0x0, 0x1696)
/usr/local/go/src/net/fd_unix.go:202 +0x4f
net.(*conn).Read(0xc00000e080, 0xc001606000, 0x16a3, 0x16a3, 0x0, 0x0, 0x0)
/usr/local/go/src/net/net.go:177 +0x69
crypto/tls.(*atLeastReader).Read(0xc0021509a0, 0xc001606000, 0x16a3, 0x16a3, 0x100b819, 0xc0019caf30, 0xc001c628f0)
/usr/local/go/src/crypto/tls/conn.go:761 +0x60
bytes.(*Buffer).ReadFrom(0xc0016b13d8, 0x1970f20, 0xc0021509a0, 0x1009875, 0x177de40, 0x182c920)
/usr/local/go/src/bytes/buffer.go:207 +0xbd
crypto/tls.(*Conn).readFromUntil(0xc0016b1180, 0x1972200, 0xc00000e080, 0x5, 0xc00000e080, 0xc001c62a10)
/usr/local/go/src/crypto/tls/conn.go:783 +0xf8
crypto/tls.(*Conn).readRecordOrCCS(0xc0016b1180, 0x189a300, 0xc0016b12b8, 0xc000e9d440)
/usr/local/go/src/crypto/tls/conn.go:590 +0x125
crypto/tls.(*Conn).readRecord(...)
/usr/local/go/src/crypto/tls/conn.go:558
crypto/tls.(*Conn).Read(0xc0016b1180, 0xc0015d2000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/crypto/tls/conn.go:1236 +0x137
net/http.(*persistConn).Read(0xc000eee5a0, 0xc0015d2000, 0x1000, 0x1000, 0xc001c62c88, 0x1004ae5, 0xc00202ba40)
/usr/local/go/src/net/http/transport.go:1524 +0x7b
bufio.(*Reader).fill(0xc001841a40)
/usr/local/go/src/bufio/bufio.go:100 +0x10f
bufio.(*Reader).Peek(0xc001841a40, 0x1, 0x0, 0x0, 0x1, 0xc001920d00, 0x0)
/usr/local/go/src/bufio/bufio.go:138 +0x4f
net/http.(*persistConn).readLoop(0xc000eee5a0)
/usr/local/go/src/net/http/transport.go:1677 +0x1a3
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1357 +0xae8

goroutine 12127 [runnable]:
assassin/http.CloneHeader(0xc001136ea0, 0xc0011f5680)
/builds/lohengrin/assassin/http/utils.go:47 +0xb1
assassin/http.(*Request).clone(0xc000e55ec0, 0x0, 0x0)
/builds/lohengrin/assassin/http/request.go:432 +0xf3
assassin/http.(*Request).Mutate(0xc000e55ec0, 0xc000ee6bd0, 0x0)
/builds/lohengrin/assassin/http/request.go:578 +0x54
assassin/plugins/crlf_injection.(*CRLFInjection).HandleFlow(0x2052100, 0x19829c0, 0xc002354000, 0x1982840, 0xc000fa3530, 0xc002354001, 0xc000e55ec0)
/builds/lohengrin/assassin/plugins/crlf_injection/crlf_injection.go:99 +0x3bb
assassin/controller.(*unit).run.func1(0xc001c3b400, 0x1982940, 0xc000ec67c0, 0x1982840, 0xc000fa3530)
/builds/lohengrin/assassin/controller/controller.go:39 +0x105
created by assassin/controller.(*unit).run
/builds/lohengrin/assassin/controller/controller.go:35 +0x138

goroutine 2726 [IO wait]:
internal/poll.runtime_pollWait(0x277a380, 0x72, 0xffffffffffffffff)
/usr/local/go/src/runtime/netpoll.go:182 +0x56
internal/poll.(*pollDesc).wait(0xc001b80f18, 0x72, 0x1000, 0x1000, 0xffffffffffffffff)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:92
internal/poll.(*FD).Read(0xc001b80f00, 0xc001067000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:169 +0x1f2
net.(*netFD).Read(0xc001b80f00, 0xc001067000, 0x1000, 0x1000, 0xc000042500, 0xc000fabc40, 0x1364e9a)
/usr/local/go/src/net/fd_unix.go:202 +0x4f
net.(*conn).Read(0xc000f863a0, 0xc001067000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/net/net.go:177 +0x69
net/http.(*connReader).Read(0xc001bfb320, 0xc001067000, 0x1000, 0x1000, 0x27b54015a2, 0x2052280, 0x72)
/usr/local/go/src/net/http/server.go:787 +0x107
bufio.(*Reader).fill(0xc001f89a40)
/usr/local/go/src/bufio/bufio.go:100 +0x10f
bufio.(*Reader).Peek(0xc001f89a40, 0x4, 0x27b54015a2, 0x2052280, 0x0, 0x0, 0x2052280)
/usr/local/go/src/bufio/bufio.go:138 +0x4f
net/http.(*conn).serve(0xc0020a9040, 0x1982940, 0xc00195a480)
/usr/local/go/src/net/http/server.go:1903 +0x9bf
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:2884 +0x2f4

goroutine 11734 [IO wait]:
internal/poll.runtime_pollWait(0x5140278, 0x72, 0xffffffffffffffff)
/usr/local/go/src/runtime/netpoll.go:182 +0x56
internal/poll.(*pollDesc).wait(0xc002402818, 0x72, 0x1600, 0x165b, 0xffffffffffffffff)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:92
internal/poll.(*FD).Read(0xc002402800, 0xc0014e0000, 0x165b, 0x165b, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:169 +0x1f2
net.(*netFD).Read(0xc002402800, 0xc0014e0000, 0x165b, 0x165b, 0x203000, 0x0, 0x164e)
/usr/local/go/src/net/fd_unix.go:202 +0x4f
net.(*conn).Read(0xc001df63d8, 0xc0014e0000, 0x165b, 0x165b, 0x0, 0x0, 0x0)
/usr/local/go/src/net/net.go:177 +0x69
crypto/tls.(*atLeastReader).Read(0xc001f34260, 0xc0014e0000, 0x165b, 0x165b, 0x100b819, 0xc0019cb920, 0xc00138b8f0)
/usr/local/go/src/crypto/tls/conn.go:761 +0x60
bytes.(*Buffer).ReadFrom(0xc001f91758, 0x1970f20, 0xc001f34260, 0x1009875, 0x177de40, 0x182c920)
/usr/local/go/src/bytes/buffer.go:207 +0xbd
crypto/tls.(*Conn).readFromUntil(0xc001f91500, 0x1972200, 0xc001df63d8, 0x5, 0xc001df63d8, 0xc00138ba10)
/usr/local/go/src/crypto/tls/conn.go:783 +0xf8
crypto/tls.(*Conn).readRecordOrCCS(0xc001f91500, 0x189a300, 0xc001f91638, 0xc000e9d440)
/usr/local/go/src/crypto/tls/conn.go:590 +0x125
crypto/tls.(*Conn).readRecord(...)
/usr/local/go/src/crypto/tls/conn.go:558
crypto/tls.(*Conn).Read(0xc001f91500, 0xc0019ed000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/crypto/tls/conn.go:1236 +0x137
net/http.(*persistConn).Read(0xc001afa5a0, 0xc0019ed000, 0x1000, 0x1000, 0xc00138bc88, 0x1004ae5, 0xc001e44cc0)
/usr/local/go/src/net/http/transport.go:1524 +0x7b
bufio.(*Reader).fill(0xc001a81d40)
/usr/local/go/src/bufio/bufio.go:100 +0x10f
bufio.(*Reader).Peek(0xc001a81d40, 0x1, 0x0, 0x0, 0x1, 0xc001bfc300, 0x0)
/usr/local/go/src/bufio/bufio.go:138 +0x4f
net/http.(*persistConn).readLoop(0xc001afa5a0)
/usr/local/go/src/net/http/transport.go:1677 +0x1a3
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1357 +0xae8

goroutine 11731 [select]:
net/http.(*persistConn).writeLoop(0xc001b785a0)
/usr/local/go/src/net/http/transport.go:1976 +0x113
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1358 +0xb0d

goroutine 11730 [IO wait]:
internal/poll.runtime_pollWait(0x5140c38, 0x72, 0xffffffffffffffff)
/usr/local/go/src/runtime/netpoll.go:182 +0x56
internal/poll.(*pollDesc).wait(0xc00204a418, 0x72, 0x1600, 0x165b, 0xffffffffffffffff)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:92
internal/poll.(*FD).Read(0xc00204a400, 0xc001607800, 0x165b, 0x165b, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:169 +0x1f2
net.(*netFD).Read(0xc00204a400, 0xc001607800, 0x165b, 0x165b, 0x203000, 0x0, 0x164e)
/usr/local/go/src/net/fd_unix.go:202 +0x4f
net.(*conn).Read(0xc0000a8018, 0xc001607800, 0x165b, 0x165b, 0x0, 0x0, 0x0)
/usr/local/go/src/net/net.go:177 +0x69
crypto/tls.(*atLeastReader).Read(0xc002150b40, 0xc001607800, 0x165b, 0x165b, 0x100b819, 0xc0019cbaa0, 0xc0017c78f0)
/usr/local/go/src/crypto/tls/conn.go:761 +0x60
bytes.(*Buffer).ReadFrom(0xc001f91058, 0x1970f20, 0xc002150b40, 0x1009875, 0x177de40, 0x182c920)
/usr/local/go/src/bytes/buffer.go:207 +0xbd
crypto/tls.(*Conn).readFromUntil(0xc001f90e00, 0x1972200, 0xc0000a8018, 0x5, 0xc0000a8018, 0xc0017c7a10)
/usr/local/go/src/crypto/tls/conn.go:783 +0xf8
crypto/tls.(*Conn).readRecordOrCCS(0xc001f90e00, 0x189a300, 0xc001f90f38, 0xc000e9d440)
/usr/local/go/src/crypto/tls/conn.go:590 +0x125
crypto/tls.(*Conn).readRecord(...)
/usr/local/go/src/crypto/tls/conn.go:558
crypto/tls.(*Conn).Read(0xc001f90e00, 0xc001775000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/crypto/tls/conn.go:1236 +0x137
net/http.(*persistConn).Read(0xc001b785a0, 0xc001775000, 0x1000, 0x1000, 0xc0017c7c88, 0x1004ae5, 0xc001e44960)
/usr/local/go/src/net/http/transport.go:1524 +0x7b
bufio.(*Reader).fill(0xc001a81620)
/usr/local/go/src/bufio/bufio.go:100 +0x10f
bufio.(*Reader).Peek(0xc001a81620, 0x1, 0x0, 0x0, 0x1, 0xc0018bfe00, 0x0)
/usr/local/go/src/bufio/bufio.go:138 +0x4f
net/http.(*persistConn).readLoop(0xc001b785a0)
/usr/local/go/src/net/http/transport.go:1677 +0x1a3
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1357 +0xae8

goroutine 12126 [runnable]:
sort.Slice(0x1719c40, 0xc002150c20, 0xc0011db5d0)
/usr/local/go/src/sort/slice.go:17 +0x176
net/http/cookiejar.(*Jar).cookies(0xc000093bc0, 0xc00201a680, 0xbf40e5f6cb1ac600, 0x22b9806779, 0x2052280, 0x0, 0x0, 0x0)
/usr/local/go/src/net/http/cookiejar/jar.go:209 +0x785
net/http/cookiejar.(*Jar).Cookies(0xc000093bc0, 0xc00201a680, 0x1043602, 0xc0000a81b8, 0x0)
/usr/local/go/src/net/http/cookiejar/jar.go:155 +0x57
net/http.(*Client).send(0xc000093b60, 0xc001e18400, 0x0, 0x0, 0x0, 0xc0000a81b8, 0x0, 0x1, 0x158b62f)
/usr/local/go/src/net/http/client.go:170 +0x51
net/http.(*Client).do(0xc000093b60, 0xc001e18400, 0x0, 0x0, 0x0)
/usr/local/go/src/net/http/client.go:641 +0x279
net/http.(*Client).Do(...)
/usr/local/go/src/net/http/client.go:509
assassin/http.(*Client).doWithRetries(0xc001832480, 0xc001e18400, 0x1, 0xc0011dbc00, 0x2, 0x2, 0x0)
/builds/lohengrin/assassin/http/client.go:142 +0x56b
assassin/http.(*Client).respond(0xc001832480, 0x19829c0, 0xc00215a060, 0xc001b0a840, 0x1, 0x0, 0x8, 0x8)
/builds/lohengrin/assassin/http/client.go:194 +0x28b
assassin/http.(*Client).Respond(...)
/builds/lohengrin/assassin/http/client.go:211
assassin/plugins/dirscan.(*Dirscan).request404(0x2052340, 0x19829c0, 0xc00215a060, 0xc001b0a780, 0xa, 0xc001b0a780, 0x0)
/builds/lohengrin/assassin/plugins/dirscan/dirscan.go:110 +0x12f
assassin/plugins/dirscan.(*Dirscan).HandleFlow(0x2052340, 0x19829c0, 0xc00215a060, 0x1982840, 0xc000fa3530, 0xc00215a001, 0xc001b0a6c0)
/builds/lohengrin/assassin/plugins/dirscan/dirscan.go:206 +0x12e
assassin/controller.(*unit).run.func1(0xc000ff3040, 0x1982940, 0xc000ec67c0, 0x1982840, 0xc000fa3530)
/builds/lohengrin/assassin/controller/controller.go:39 +0x105
created by assassin/controller.(*unit).run
/builds/lohengrin/assassin/controller/controller.go:35 +0x138

goroutine 2727 [IO wait]:
internal/poll.runtime_pollWait(0x5105ea0, 0x72, 0xffffffffffffffff)
/usr/local/go/src/runtime/netpoll.go:182 +0x56
internal/poll.(*pollDesc).wait(0xc002286818, 0x72, 0x1000, 0x1000, 0xffffffffffffffff)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:92
internal/poll.(*FD).Read(0xc002286800, 0xc001194000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:169 +0x1f2
net.(*netFD).Read(0xc002286800, 0xc001194000, 0x1000, 0x1000, 0xc001a50c40, 0x137e8b6, 0xc000e9d440)
/usr/local/go/src/net/fd_unix.go:202 +0x4f
net.(*conn).Read(0xc0001ee230, 0xc001194000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/net/net.go:177 +0x69
net/http.(*persistConn).Read(0xc001010360, 0xc001194000, 0x1000, 0x1000, 0xc001a50c88, 0x1004ae5, 0xc001ae8c60)
/usr/local/go/src/net/http/transport.go:1524 +0x7b
bufio.(*Reader).fill(0xc000f85800)
/usr/local/go/src/bufio/bufio.go:100 +0x10f
bufio.(*Reader).Peek(0xc000f85800, 0x1, 0x0, 0x0, 0x1, 0xc000090400, 0x0)
/usr/local/go/src/bufio/bufio.go:138 +0x4f
net/http.(*persistConn).readLoop(0xc001010360)
/usr/local/go/src/net/http/transport.go:1677 +0x1a3
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1357 +0xae8

goroutine 9821 [select]:
net/http.(*persistConn).writeLoop(0xc000eee5a0)
/usr/local/go/src/net/http/transport.go:1976 +0x113
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1358 +0xb0d

goroutine 2728 [select]:
net/http.(*persistConn).writeLoop(0xc001010360)
/usr/local/go/src/net/http/transport.go:1976 +0x113
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1358 +0xb0d

goroutine 11735 [select]:
net/http.(*persistConn).writeLoop(0xc001afa5a0)
/usr/local/go/src/net/http/transport.go:1976 +0x113
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1358 +0xb0d

关于config配置过滤域名的问题

includes: # 允许扫描的域
- "*.example.com"

可以配置多个子域名么?

(.*?).(a|b).example.com

  • test.a.example.com
  • test.b.example.com

(.*?).(example1|example2).com

  • test.example1.com
  • test.example2.com

建议发布32位的linux版本

由于有些老设备配置不高,可能用的还是32位linux系统,建议版本发布时像windows一样,也同时发布32位与64位的版本。

建议增强Referer支持

建议增强Referer支持:
在使用yaml自定义poc时,支持referer以target(目标url)+自定义uri。

希望白名单扫描域中增加区分端口号

配置文件config.yaml中,设置允许扫描的域的时候,发现如果设置域的时候是带端口号的话(例如这种:- "10.17.65.135:1289/*"),以代理模式开启xray后,挂了一下午没什么反应。希望白名单扫描域中增加带端口号的识别,满足测试带端口号的URL的需求

可否支持更细粒度的目标配置

被动扫描能否支持这样的场景:会员业务 taodao.com/user 商品业务taodao.com/item,可能安全测试时仅仅想针对商品业务进行测试,希望被动扫描只针对taodao.com/item下的url进行扫描

当前的被动扫描似乎只能控制到域名级别

动态扫描规则建议

比如,清洗好的流量,走mitmxray喂数据时,可以动态控制扫描规则sqli,xxe,ssrf.

比如可以在headers,cookie,url参数上附加,进行动态规则控制.

//mitm添加headers
Scan_Type: ssrf,sqli,lfi 
//Cookies上
Scan_Type=ssrf,sqli,lfi;

最终实现,看到参数中有url,就仅测试ssrf。判断参数中有"Sort=desc", 就仅测试sqli

另外,遇到这些附加的头,接收后,一定要删掉!

Host绑定建议

类似以下的效果

 curl --resolve ip.cn:443:1.1.1.1  https://ip.cn -H 'Host: ip.cn' -v --connect-timeout 5

走mitm时,ssl/sni hostname,是ip.cn, 强制绑定到1.1.1.1.
比如内网测试环境绑host的场景, 也有跨国分运营商走edns智能解析的场景。
也比如找到了源站ip, 就可以绕waf了。

建议增加POST请求时对data数据的分块传输功能

建议增加POST请求时对data数据的分块传输功能:
1、在config配置中可以设置POST请求时对data数据的分块传输功能开关。
2、在config配置中可以设置分块传输的分块长度或块数范围。
3、分块传输时分块长度后自动加上混淆字符串。

配置文件中指定从目录加载 PoC

之前提到的从指定目录加载 PoC (#41 )在命令行端已经实现了,感谢大佬们。

现在的情况是在配置文件中以 glob 的形式指定 PoC 无法加载。

配置如下:

  phantasm:
    enabled: true
    poc:
    #- poc-yaml-drupal-drupalgeddon2-rce
    #- poc-yaml-joomla-cve-2015-7297-sqli
    #- poc-yaml-joomla-cve-2017-8917-sqli
    #- poc-yaml-thinkphp5-controller-rce
    #- poc-yaml-thinkphp5023-method-rce
    #- poc-go-tomcat-put
    - E:\xray\poc\*

运行结果:

xray-poc-from-config-dir-fail

可以看到从命令行指定--poc是可以的,但是配置文件中的配置未生效,希望这两部分可以同步,感谢。

建议SQL注入等其他插件可以自定义检测payload

建议添加一个sql注入的配置文件,里面可以使用自定义payload,因为每一个人对SQL语句认识不同,有的人使用的payload可能比较特殊。
还有就是写死payload的话如果目标存在SQL注入,但是存在waf,像这样传统的'and ''='或 and 1=1这种方式是没办法发现的。这时候需要自定义payload更为有效去发现SQL注入。

一些功能增强建议

0x00 json输出格式问题

json能一行一行输出么?现在的--json-output是json展开了,并且开始是[,每个json连接有个,,如果监控json文件结果,不好处理,查看结果,jq 也不好查看.
如果一行一个json,不用展开就是最好滴.

0x01 headers问题

现在只能预制1个header,在mitm原始流量和xray扫描流量容易混合了。在后面的nginx lua上不好做规则。mitm和scan流量能分别设置headers么。这样就容易区分了。
所以,建议config.yml中2处headers自定义配置. mitm的,扫描的.

0x02 webhook功能

扫描成功后,带上原始json,向指定url发送一个post请求,那就是最好滴.

0x03 reverse功能

是否后期可能对接dnslog平台呢?
或者对齐下格式,dnslog平台异步打个请求回来。

0x04 http代理问题

能否兼容下proxychains(ng)等工具的http代理. (换个代理库可能就好了. 比如v2ray-core之类的兼容性好)
比如proxychains4 python soft.py把流量导入xray

SQL注入 误报

举个例子

./xray_linux_amd64  webscan  --plugins sqldet --url "http://xxxx.qq.com/qunvideo/hall.html?_bid=2227&_wv=5127&from=tuijian_more"

image

image

多线程并发报错的问题

`fatal error: concurrent map iteration and map write

goroutine 23989 [running]:
runtime.throw(0xd01b83, 0x26)
/usr/local/go/src/runtime/panic.go:617 +0x79 fp=0xc001a79d18 sp=0xc001a79ce8 pc=0x4308e9
runtime.mapiternext(0xc001a79e40)
/usr/local/go/src/runtime/map.go:860 +0x59e fp=0xc001a79da0 sp=0xc001a79d18 pc=0x40f61e
assassin/http.(*Request).clone(0xc0015b52c0, 0xc001f12001, 0xc001a79f40)
/builds/lohengrin/assassin/http/request.go:446 +0x212 fp=0xc001a79f10 sp=0xc001a79da0 pc=0x9f9812
assassin/http.(*Flow).DeepClone(0xc00117fda0, 0xc000ef2090, 0x29e8d60800)
/builds/lohengrin/assassin/http/resource.go:29 +0x3a fp=0xc001a79f38 sp=0xc001a79f10 pc=0x9fdfca
assassin/controller.(*unit).run.func1(0xc001118690, 0xe11540, 0xc000fe0c00, 0xe11480, 0xc00117fda0)
/builds/lohengrin/assassin/controller/controller.go:40 +0xd4 fp=0xc001a79fb8 sp=0xc001a79f38 pc=0xaef514
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1337 +0x1 fp=0xc001a79fc0 sp=0xc001a79fb8 pc=0x45de71
created by assassin/controller.(*unit).run
/builds/lohengrin/assassin/controller/controller.go:36 +0x13f`

win64下在使用多线程的时候报错

建议支持命令行配置include exclude

在 mitm 的配置部分还有两项配置值得注意:

includes表示只扫描哪些域。比如 *.example.com 只扫描 example.com 的子域
excludes 表示不扫描哪些域。比如 t.example.com 表示不扫描 t.example.com

建议支持 --includes xxx.com --excludes sss.com

建议配置文件可以增加一个网站编程语言的配置选项

建议配置文件可以增加一个网站编程语言的配置选项可以是dirscan发出的请求更有针对性,如果一个php写的网站发一些x.jsp x.asp x.aspx的请求不仅没用还增加了服务器的响应压力。(除了文件后缀不同的编程语言写的网站目录都还有一些其他的特征,针对不同的语言可以使用不同的字典最好)

从指定目录批量加载自定义 PoC

目前自定义 PoC 使用--poc来调用,虽然可以通过逗号分隔加载多个,但当自定义 PoC 较多时还是不太友好,建议增加自定义 PoC 目录这一选项,方便用户批量调用。

Thx

打印显示更多细节

  • 使用被动扫描的时候,tagets pending in queue打印这些信息的时候,可不可打印出更多的信息,比如targets。
  • 可不可以打印出扫描的进度

输出 json 数据

输出结果时能不能不依赖文件,直接在 stdout 里输出 json 格式的结果

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.